1r"""Usage: prog 2 3""" 4$ prog 5{} 6 7$ prog --xxx 8"user-error" 9 10 11r"""Usage: prog [options] 12 13Options: -a All. 14 15""" 16$ prog 17{"-a": false} 18 19$ prog -a 20{"-a": true} 21 22$ prog -x 23"user-error" 24 25 26r"""Usage: prog [options] 27 28Options: --all All. 29 30""" 31$ prog 32{"--all": false} 33 34$ prog --all 35{"--all": true} 36 37$ prog --xxx 38"user-error" 39 40 41r"""Usage: prog [options] 42 43Options: -v, --verbose Verbose. 44 45""" 46$ prog --verbose 47{"--verbose": true} 48 49$ prog --ver 50"user-error" 51 52$ prog -v 53{"--verbose": true} 54 55 56r"""Usage: prog [options] 57 58Options: -p PATH 59 60""" 61$ prog -p home/ 62{"-p": "home/"} 63 64$ prog -phome/ 65{"-p": "home/"} 66 67$ prog -p 68"user-error" 69 70 71r"""Usage: prog [options] 72 73Options: --path <path> 74 75""" 76$ prog --path home/ 77{"--path": "home/"} 78 79$ prog --path=home/ 80{"--path": "home/"} 81 82$ prog --pa home/ 83"user-error" 84 85$ prog --pa=home/ 86"user-error" 87 88$ prog --path 89"user-error" 90 91 92r"""Usage: prog [options] 93 94Options: -p PATH, --path=<path> Path to files. 95 96""" 97$ prog -proot 98{"--path": "root"} 99 100 101r"""Usage: prog [options] 102 103Options: -p --path PATH Path to files. 104 105""" 106$ prog -p root 107{"--path": "root"} 108 109$ prog --path root 110{"--path": "root"} 111 112 113r"""Usage: prog [options] 114 115Options: 116 -p PATH Path to files [default: ./] 117 118""" 119$ prog 120{"-p": "./"} 121 122$ prog -phome 123{"-p": "home"} 124 125 126r"""UsAgE: prog [options] 127 128OpTiOnS: --path=<files> Path to files 129 [dEfAuLt: /root] 130 131""" 132$ prog 133{"--path": "/root"} 134 135$ prog --path=home 136{"--path": "home"} 137 138 139r"""usage: prog [options] 140 141options: 142 -a Add 143 -r Remote 144 -m <msg> Message 145 146""" 147$ prog -a -r -m Hello 148{"-a": true, 149 "-r": true, 150 "-m": "Hello"} 151 152$ prog -armyourass 153{"-a": true, 154 "-r": true, 155 "-m": "yourass"} 156 157$ prog -a -r 158{"-a": true, 159 "-r": true, 160 "-m": null} 161 162 163r"""Usage: prog [options] 164 165Options: --version 166 --verbose 167 168""" 169$ prog --version 170{"--version": true, 171 "--verbose": false} 172 173$ prog --verbose 174{"--version": false, 175 "--verbose": true} 176 177$ prog --ver 178"user-error" 179 180$ prog --verb 181"user-error" 182 183 184r"""usage: prog [-a -r -m <msg>] 185 186options: 187 -a Add 188 -r Remote 189 -m <msg> Message 190 191""" 192$ prog -armyourass 193{"-a": true, 194 "-r": true, 195 "-m": "yourass"} 196 197 198r"""usage: prog [-armMSG] 199 200options: -a Add 201 -r Remote 202 -m <msg> Message 203 204""" 205$ prog -a -r -m Hello 206{"-a": true, 207 "-r": true, 208 "-m": "Hello"} 209 210 211r"""usage: prog -a -b 212 213options: 214 -a 215 -b 216 217""" 218$ prog -a -b 219{"-a": true, "-b": true} 220 221$ prog -b -a 222{"-a": true, "-b": true} 223 224$ prog -a 225"user-error" 226 227$ prog 228"user-error" 229 230 231r"""usage: prog (-a -b) 232 233options: -a 234 -b 235 236""" 237$ prog -a -b 238{"-a": true, "-b": true} 239 240$ prog -b -a 241{"-a": true, "-b": true} 242 243$ prog -a 244"user-error" 245 246$ prog 247"user-error" 248 249 250r"""usage: prog [-a] -b 251 252options: -a 253 -b 254 255""" 256$ prog -a -b 257{"-a": true, "-b": true} 258 259$ prog -b -a 260{"-a": true, "-b": true} 261 262$ prog -a 263"user-error" 264 265$ prog -b 266{"-a": false, "-b": true} 267 268$ prog 269"user-error" 270 271 272r"""usage: prog [(-a -b)] 273 274options: -a 275 -b 276 277""" 278$ prog -a -b 279{"-a": true, "-b": true} 280 281$ prog -b -a 282{"-a": true, "-b": true} 283 284$ prog -a 285"user-error" 286 287$ prog -b 288"user-error" 289 290$ prog 291{"-a": false, "-b": false} 292 293 294r"""usage: prog (-a|-b) 295 296options: -a 297 -b 298 299""" 300$ prog -a -b 301"user-error" 302 303$ prog 304"user-error" 305 306$ prog -a 307{"-a": true, "-b": false} 308 309$ prog -b 310{"-a": false, "-b": true} 311 312 313r"""usage: prog [ -a | -b ] 314 315options: -a 316 -b 317 318""" 319$ prog -a -b 320"user-error" 321 322$ prog 323{"-a": false, "-b": false} 324 325$ prog -a 326{"-a": true, "-b": false} 327 328$ prog -b 329{"-a": false, "-b": true} 330 331 332r"""usage: prog <arg>""" 333$ prog 10 334{"<arg>": "10"} 335 336$ prog 10 20 337"user-error" 338 339$ prog 340"user-error" 341 342 343r"""usage: prog [<arg>]""" 344$ prog 10 345{"<arg>": "10"} 346 347$ prog 10 20 348"user-error" 349 350$ prog 351{"<arg>": null} 352 353 354r"""usage: prog <kind> <name> <type>""" 355$ prog 10 20 40 356{"<kind>": "10", "<name>": "20", "<type>": "40"} 357 358$ prog 10 20 359"user-error" 360 361$ prog 362"user-error" 363 364 365r"""usage: prog <kind> [<name> <type>]""" 366$ prog 10 20 40 367{"<kind>": "10", "<name>": "20", "<type>": "40"} 368 369$ prog 10 20 370{"<kind>": "10", "<name>": "20", "<type>": null} 371 372$ prog 373"user-error" 374 375 376r"""usage: prog [<kind> | <name> <type>]""" 377$ prog 10 20 40 378"user-error" 379 380$ prog 20 40 381{"<kind>": null, "<name>": "20", "<type>": "40"} 382 383$ prog 384{"<kind>": null, "<name>": null, "<type>": null} 385 386 387r"""usage: prog (<kind> --all | <name>) 388 389options: 390 --all 391 392""" 393$ prog 10 --all 394{"<kind>": "10", "--all": true, "<name>": null} 395 396$ prog 10 397{"<kind>": null, "--all": false, "<name>": "10"} 398 399$ prog 400"user-error" 401 402 403r"""usage: prog [<name> <name>]""" 404$ prog 10 20 405{"<name>": ["10", "20"]} 406 407$ prog 10 408{"<name>": ["10"]} 409 410$ prog 411{"<name>": []} 412 413 414r"""usage: prog [(<name> <name>)]""" 415$ prog 10 20 416{"<name>": ["10", "20"]} 417 418$ prog 10 419"user-error" 420 421$ prog 422{"<name>": []} 423 424 425r"""usage: prog NAME...""" 426$ prog 10 20 427{"NAME": ["10", "20"]} 428 429$ prog 10 430{"NAME": ["10"]} 431 432$ prog 433"user-error" 434 435 436r"""usage: prog [NAME]...""" 437$ prog 10 20 438{"NAME": ["10", "20"]} 439 440$ prog 10 441{"NAME": ["10"]} 442 443$ prog 444{"NAME": []} 445 446 447r"""usage: prog [NAME...]""" 448$ prog 10 20 449{"NAME": ["10", "20"]} 450 451$ prog 10 452{"NAME": ["10"]} 453 454$ prog 455{"NAME": []} 456 457 458r"""usage: prog [NAME [NAME ...]]""" 459$ prog 10 20 460{"NAME": ["10", "20"]} 461 462$ prog 10 463{"NAME": ["10"]} 464 465$ prog 466{"NAME": []} 467 468 469r"""usage: prog (NAME | --foo NAME) 470 471options: --foo 472 473""" 474$ prog 10 475{"NAME": "10", "--foo": false} 476 477$ prog --foo 10 478{"NAME": "10", "--foo": true} 479 480$ prog --foo=10 481"user-error" 482 483 484r"""usage: prog (NAME | --foo) [--bar | NAME] 485 486options: --foo 487options: --bar 488 489""" 490$ prog 10 491{"NAME": ["10"], "--foo": false, "--bar": false} 492 493$ prog 10 20 494{"NAME": ["10", "20"], "--foo": false, "--bar": false} 495 496$ prog --foo --bar 497{"NAME": [], "--foo": true, "--bar": true} 498 499 500r"""Naval Fate. 501 502Usage: 503 prog ship new <name>... 504 prog ship [<name>] move <x> <y> [--speed=<kn>] 505 prog ship shoot <x> <y> 506 prog mine (set|remove) <x> <y> [--moored|--drifting] 507 prog -h | --help 508 prog --version 509 510Options: 511 -h --help Show this screen. 512 --version Show version. 513 --speed=<kn> Speed in knots [default: 10]. 514 --moored Mored (anchored) mine. 515 --drifting Drifting mine. 516 517""" 518$ prog ship Guardian move 150 300 --speed=20 519{"--drifting": false, 520 "--help": false, 521 "--moored": false, 522 "--speed": "20", 523 "--version": false, 524 "<name>": ["Guardian"], 525 "<x>": "150", 526 "<y>": "300", 527 "mine": false, 528 "move": true, 529 "new": false, 530 "remove": false, 531 "set": false, 532 "ship": true, 533 "shoot": false} 534 535 536r"""usage: prog --hello""" 537$ prog --hello 538{"--hello": true} 539 540 541r"""usage: prog [--hello=<world>]""" 542$ prog 543{"--hello": null} 544 545$ prog --hello wrld 546{"--hello": "wrld"} 547 548 549r"""usage: prog [-o]""" 550$ prog 551{"-o": false} 552 553$ prog -o 554{"-o": true} 555 556 557r"""usage: prog [-opr]""" 558$ prog -op 559{"-o": true, "-p": true, "-r": false} 560 561 562r"""usage: prog --aabb | --aa""" 563$ prog --aa 564{"--aabb": false, "--aa": true} 565 566$ prog --a 567"user-error" # not a unique prefix 568 569# 570# Counting number of flags 571# 572 573r"""Usage: prog -v""" 574$ prog -v 575{"-v": true} 576 577 578r"""Usage: prog [-v -v]""" 579$ prog 580{"-v": 0} 581 582$ prog -v 583{"-v": 1} 584 585$ prog -vv 586{"-v": 2} 587 588 589r"""Usage: prog -v ...""" 590$ prog 591"user-error" 592 593$ prog -v 594{"-v": 1} 595 596$ prog -vv 597{"-v": 2} 598 599$ prog -vvvvvv 600{"-v": 6} 601 602 603r"""Usage: prog [-v | -vv | -vvv] 604 605This one is probably most readable user-friednly variant. 606 607""" 608$ prog 609{"-v": 0} 610 611$ prog -v 612{"-v": 1} 613 614$ prog -vv 615{"-v": 2} 616 617$ prog -vvvv 618"user-error" 619 620 621r"""usage: prog [--ver --ver]""" 622$ prog --ver --ver 623{"--ver": 2} 624 625 626# 627# Counting commands 628# 629 630r"""usage: prog [go]""" 631$ prog go 632{"go": true} 633 634 635r"""usage: prog [go go]""" 636$ prog 637{"go": 0} 638 639$ prog go 640{"go": 1} 641 642$ prog go go 643{"go": 2} 644 645$ prog go go go 646"user-error" 647 648r"""usage: prog go...""" 649$ prog go go go go go 650{"go": 5} 651 652# 653# [options] does not include options from usage-pattern 654# 655r"""usage: prog [options] [-a] 656 657options: -a 658 -b 659""" 660$ prog -a 661{"-a": true, "-b": false} 662 663$ prog -aa 664"user-error" 665 666# 667# Test [options] shourtcut 668# 669 670r"""Usage: prog [options] A 671 672Options: 673 -q Be quiet 674 -v Be verbose. 675 676""" 677$ prog arg 678{"A": "arg", "-v": false, "-q": false} 679 680$ prog -v arg 681{"A": "arg", "-v": true, "-q": false} 682 683$ prog -q arg 684{"A": "arg", "-v": false, "-q": true} 685 686# 687# Test single dash 688# 689 690r"""usage: prog [-]""" 691 692$ prog - 693{"-": true} 694 695$ prog 696{"-": false} 697 698# 699# If argument is repeated, its value should always be a list 700# 701 702r"""usage: prog [NAME [NAME ...]]""" 703 704$ prog a b 705{"NAME": ["a", "b"]} 706 707$ prog 708{"NAME": []} 709 710# 711# Option's argument defaults to null/None 712# 713 714r"""usage: prog [options] 715 716options: 717 -a Add 718 -m <msg> Message 719 720""" 721$ prog -a 722{"-m": null, "-a": true} 723 724# 725# Test options without description 726# 727 728r"""usage: prog --hello""" 729$ prog --hello 730{"--hello": true} 731 732r"""usage: prog [--hello=<world>]""" 733$ prog 734{"--hello": null} 735 736$ prog --hello wrld 737{"--hello": "wrld"} 738 739r"""usage: prog [-o]""" 740$ prog 741{"-o": false} 742 743$ prog -o 744{"-o": true} 745 746r"""usage: prog [-opr]""" 747$ prog -op 748{"-o": true, "-p": true, "-r": false} 749 750r"""usage: git [-v | --verbose]""" 751$ prog -v 752{"-v": true, "--verbose": false} 753 754r"""usage: git remote [-v | --verbose]""" 755$ prog remote -v 756{"remote": true, "-v": true, "--verbose": false} 757 758# 759# Test empty usage pattern 760# 761 762r"""usage: prog""" 763$ prog 764{} 765 766r"""usage: prog 767 prog <a> <b> 768""" 769$ prog 1 2 770{"<a>": "1", "<b>": "2"} 771 772$ prog 773{"<a>": null, "<b>": null} 774 775r"""usage: prog <a> <b> 776 prog 777""" 778$ prog 779{"<a>": null, "<b>": null} 780 781# 782# Option's argument should not capture default value from usage pattern 783# 784 785r"""usage: prog [--file=<f>]""" 786$ prog 787{"--file": null} 788 789r"""usage: prog [--file=<f>] 790 791options: --file <a> 792 793""" 794$ prog 795{"--file": null} 796 797r"""Usage: prog [-a <host:port>] 798 799Options: -a, --address <host:port> TCP address [default: localhost:6283]. 800 801""" 802$ prog 803{"--address": "localhost:6283"} 804 805# 806# If option with argument could be repeated, 807# its arguments should be accumulated into a list 808# 809 810r"""usage: prog --long=<arg> ...""" 811 812$ prog --long one 813{"--long": ["one"]} 814 815$ prog --long one --long two 816{"--long": ["one", "two"]} 817 818# 819# Test multiple elements repeated at once 820# 821 822r"""usage: prog (go <direction> --speed=<km/h>)...""" 823$ prog go left --speed=5 go right --speed=9 824{"go": 2, "<direction>": ["left", "right"], "--speed": ["5", "9"]} 825 826# 827# Required options should work with option shortcut 828# 829 830r"""usage: prog [options] -a 831 832options: -a 833 834""" 835$ prog -a 836{"-a": true} 837 838# 839# If option could be repeated its defaults should be split into a list 840# 841 842r"""usage: prog [-o <o>]... 843 844options: -o <o> [default: x] 845 846""" 847$ prog -o this -o that 848{"-o": ["this", "that"]} 849 850$ prog 851{"-o": ["x"]} 852 853r"""usage: prog [-o <o>]... 854 855options: -o <o> [default: x y] 856 857""" 858$ prog -o this 859{"-o": ["this"]} 860 861$ prog 862{"-o": ["x", "y"]} 863 864# 865# Test stacked option's argument 866# 867 868r"""usage: prog -pPATH 869 870options: -p PATH 871 872""" 873$ prog -pHOME 874{"-p": "HOME"} 875 876# 877# Issue 56: Repeated mutually exclusive args give nested lists sometimes 878# 879 880r"""Usage: foo (--xx=X|--yy=Y)...""" 881$ prog --xx=1 --yy=2 882{"--xx": ["1"], "--yy": ["2"]} 883 884# 885# POSIXly correct tokenization 886# 887 888r"""usage: prog [<input file>]""" 889$ prog f.txt 890{"<input file>": "f.txt"} 891 892r"""usage: prog [--input=<file name>]...""" 893$ prog --input a.txt --input=b.txt 894{"--input": ["a.txt", "b.txt"]} 895 896# 897# Issue 85: `[options]` shourtcut with multiple subcommands 898# 899 900r"""usage: prog good [options] 901 prog fail [options] 902 903options: --loglevel=N 904 905""" 906$ prog fail --loglevel 5 907{"--loglevel": "5", "fail": true, "good": false} 908 909# 910# Usage-section syntax 911# 912 913r"""usage:prog --foo""" 914$ prog --foo 915{"--foo": true} 916 917r"""PROGRAM USAGE: prog --foo""" 918$ prog --foo 919{"--foo": true} 920 921r"""Usage: prog --foo 922 prog --bar 923NOT PART OF SECTION""" 924$ prog --foo 925{"--foo": true, "--bar": false} 926 927r"""Usage: 928 prog --foo 929 prog --bar 930 931NOT PART OF SECTION""" 932$ prog --foo 933{"--foo": true, "--bar": false} 934 935r"""Usage: 936 prog --foo 937 prog --bar 938NOT PART OF SECTION""" 939$ prog --foo 940{"--foo": true, "--bar": false} 941 942# 943# Options-section syntax 944# 945 946r"""Usage: prog [options] 947 948global options: --foo 949local options: --baz 950 --bar 951other options: 952 --egg 953 --spam 954-not-an-option- 955 956""" 957$ prog --bar --egg 958{"--bar": true, "--egg": true, "--spam": false} 959 960r"""Usage: prog [-a] [--] [<arg>...]""" 961$ program -a 962{"-a": true, "<arg>": []} 963 964r"""Usage: prog [-a] [--] [<arg>...]""" 965$ program -- 966{"-a": false, "<arg>": []} 967 968r"""Usage: prog [-a] [--] [<arg>...]""" 969$ program -a -- -b 970{"-a": true, "<arg>": ["-b"]} 971 972r"""Usage: prog [-a] [--] [<arg>...]""" 973$ program -a -- -a 974{"-a": true, "<arg>": ["-a"]} 975 976r"""Usage: prog [-a] [--] [<arg>...]""" 977$ program -- -a 978{"-a": false, "<arg>": ["-a"]} 979 980r"""Usage: prog test [options] [--] [<args>...]""" 981$ program test a -- -b 982{"<args>": ["a", "-b"]} 983 984r"""Usage: prog test [options] [--] [<args>...]""" 985$ program test -- -b 986{"<args>": ["-b"]} 987 988r"""Usage: prog test [options] [--] [<args>...]""" 989$ program test a -b 990"user-error" 991 992r"""Usage: prog test [options] [--] [<args>...]""" 993$ program test -- -b -- 994{"<args>": ["-b", "--"]} 995 996r"""Usage: prog [options] 997 998Options: 999 -a ... Foo 1000""" 1001$ program 1002{"-a": 0} 1003$ program -a 1004{"-a": 1} 1005$ program -a -a 1006{"-a": 2} 1007$ program -aa 1008{"-a": 2} 1009$ program -a -a -a 1010{"-a": 3} 1011$ program -aaa 1012{"-a": 3} 1013 1014r"""Usage: prog [options] 1015 1016Options: 1017 -a, --all ... Foo 1018""" 1019$ program 1020{"-a": 0} 1021$ program -a 1022{"-a": 1} 1023$ program -a --all 1024{"-a": 2} 1025$ program -aa --all 1026{"-a": 3} 1027$ program --all 1028{"-a": 1} 1029$ program --all --all 1030{"-a": 2} 1031 1032r"""Usage: prog [options] 1033 1034Options: 1035 -a, --all ARG ... Foo 1036""" 1037$ program 1038{"-a": []} 1039$ program -a 1 1040{"-a": ["1"]} 1041$ program -a 2 --all 3 1042{"-a": ["2", "3"]} 1043$ program -a4 -a5 --all 6 1044{"-a": ["4", "5", "6"]} 1045$ program --all 7 1046{"-a": ["7"]} 1047$ program --all 8 --all 9 1048{"-a": ["8", "9"]} 1049 1050r"""Usage: prog [options] 1051 1052Options: 1053 --all ... Foo 1054""" 1055$ program 1056{"--all": 0} 1057$ program --all 1058{"--all": 1} 1059$ program --all --all 1060{"--all": 2} 1061 1062r"""Usage: prog [options] 1063 1064Options: 1065 --all=ARG ... Foo 1066""" 1067$ program 1068{"--all": []} 1069$ program --all 1 1070{"--all": ["1"]} 1071$ program --all 2 --all 3 1072{"--all": ["2", "3"]} 1073 1074r"""Usage: prog [options] 1075 1076Options: 1077 --all ... Foo 1078""" 1079$ program --all --all 1080"user-error" 1081 1082r"""Usage: prog [options] 1083 1084Options: 1085 --all ARG ... Foo 1086""" 1087$ program --all foo --all bar 1088"user-error" 1089 1090r"""Usage: prog --speed=ARG""" 1091$ program --speed 20 1092{"--speed": "20"} 1093$ program --speed=20 1094{"--speed": "20"} 1095$ program --speed=-20 1096{"--speed": "-20"} 1097$ program --speed -20 1098{"--speed": "-20"} 1099 1100# 1101# Issue 187: Fails to parse a default value containing ']' 1102# 1103 1104r"""usage: prog [--datetime=<regex>] 1105 1106options: --datetime=<regex> Regex for datetimes [default: ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}] 1107 1108""" 1109$ prog 1110{"--datetime": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}"} 1111 1112# 1113# Issue 137: -x-y being seen as a positional argument 1114# 1115 1116r"""Usage: prog [options] 1117 1118Options: 1119 -x ARG 1120 -y""" 1121$ prog -x-y 1122{"-x": "-y"} 1123