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{"--verbose": true} 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{"--path": "home/"} 84 85$ prog --pa=home/ 86{"--path": "home/"} 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{"--version": false, 182 "--verbose": true} 183 184 185r"""usage: prog [-a -r -m <msg>] 186 187options: 188 -a Add 189 -r Remote 190 -m <msg> Message 191 192""" 193$ prog -armyourass 194{"-a": true, 195 "-r": true, 196 "-m": "yourass"} 197 198 199r"""usage: prog [-armmsg] 200 201options: -a Add 202 -r Remote 203 -m <msg> Message 204 205""" 206$ prog -a -r -m Hello 207{"-a": true, 208 "-r": true, 209 "-m": "Hello"} 210 211 212r"""usage: prog -a -b 213 214options: 215 -a 216 -b 217 218""" 219$ prog -a -b 220{"-a": true, "-b": true} 221 222$ prog -b -a 223{"-a": true, "-b": true} 224 225$ prog -a 226"user-error" 227 228$ prog 229"user-error" 230 231 232r"""usage: prog (-a -b) 233 234options: -a 235 -b 236 237""" 238$ prog -a -b 239{"-a": true, "-b": true} 240 241$ prog -b -a 242{"-a": true, "-b": true} 243 244$ prog -a 245"user-error" 246 247$ prog 248"user-error" 249 250 251r"""usage: prog [-a] -b 252 253options: -a 254 -b 255 256""" 257$ prog -a -b 258{"-a": true, "-b": true} 259 260$ prog -b -a 261{"-a": true, "-b": true} 262 263$ prog -a 264"user-error" 265 266$ prog -b 267{"-a": false, "-b": true} 268 269$ prog 270"user-error" 271 272 273r"""usage: prog [(-a -b)] 274 275options: -a 276 -b 277 278""" 279$ prog -a -b 280{"-a": true, "-b": true} 281 282$ prog -b -a 283{"-a": true, "-b": true} 284 285$ prog -a 286"user-error" 287 288$ prog -b 289"user-error" 290 291$ prog 292{"-a": false, "-b": false} 293 294 295r"""usage: prog (-a|-b) 296 297options: -a 298 -b 299 300""" 301$ prog -a -b 302"user-error" 303 304$ prog 305"user-error" 306 307$ prog -a 308{"-a": true, "-b": false} 309 310$ prog -b 311{"-a": false, "-b": true} 312 313 314r"""usage: prog [ -a | -b ] 315 316options: -a 317 -b 318 319""" 320$ prog -a -b 321"user-error" 322 323$ prog 324{"-a": false, "-b": false} 325 326$ prog -a 327{"-a": true, "-b": false} 328 329$ prog -b 330{"-a": false, "-b": true} 331 332 333r"""usage: prog <arg>""" 334$ prog 10 335{"<arg>": "10"} 336 337$ prog 10 20 338"user-error" 339 340$ prog 341"user-error" 342 343 344r"""usage: prog [<arg>]""" 345$ prog 10 346{"<arg>": "10"} 347 348$ prog 10 20 349"user-error" 350 351$ prog 352{"<arg>": null} 353 354 355r"""usage: prog <kind> <name> <type>""" 356$ prog 10 20 40 357{"<kind>": "10", "<name>": "20", "<type>": "40"} 358 359$ prog 10 20 360"user-error" 361 362$ prog 363"user-error" 364 365 366r"""usage: prog <kind> [<name> <type>]""" 367$ prog 10 20 40 368{"<kind>": "10", "<name>": "20", "<type>": "40"} 369 370$ prog 10 20 371{"<kind>": "10", "<name>": "20", "<type>": null} 372 373$ prog 374"user-error" 375 376 377r"""usage: prog [<kind> | <name> <type>]""" 378$ prog 10 20 40 379"user-error" 380 381$ prog 20 40 382{"<kind>": null, "<name>": "20", "<type>": "40"} 383 384$ prog 385{"<kind>": null, "<name>": null, "<type>": null} 386 387 388r"""usage: prog (<kind> --all | <name>) 389 390options: 391 --all 392 393""" 394$ prog 10 --all 395{"<kind>": "10", "--all": true, "<name>": null} 396 397$ prog 10 398{"<kind>": null, "--all": false, "<name>": "10"} 399 400$ prog 401"user-error" 402 403 404r"""usage: prog [<name> <name>]""" 405$ prog 10 20 406{"<name>": ["10", "20"]} 407 408$ prog 10 409{"<name>": ["10"]} 410 411$ prog 412{"<name>": []} 413 414 415r"""usage: prog [(<name> <name>)]""" 416$ prog 10 20 417{"<name>": ["10", "20"]} 418 419$ prog 10 420"user-error" 421 422$ prog 423{"<name>": []} 424 425 426r"""usage: prog NAME...""" 427$ prog 10 20 428{"NAME": ["10", "20"]} 429 430$ prog 10 431{"NAME": ["10"]} 432 433$ prog 434"user-error" 435 436 437r"""usage: prog [NAME]...""" 438$ prog 10 20 439{"NAME": ["10", "20"]} 440 441$ prog 10 442{"NAME": ["10"]} 443 444$ prog 445{"NAME": []} 446 447 448r"""usage: prog [NAME...]""" 449$ prog 10 20 450{"NAME": ["10", "20"]} 451 452$ prog 10 453{"NAME": ["10"]} 454 455$ prog 456{"NAME": []} 457 458 459r"""usage: prog [NAME [NAME ...]]""" 460$ prog 10 20 461{"NAME": ["10", "20"]} 462 463$ prog 10 464{"NAME": ["10"]} 465 466$ prog 467{"NAME": []} 468 469 470r"""usage: prog (NAME | --foo NAME) 471 472options: --foo 473 474""" 475$ prog 10 476{"NAME": "10", "--foo": false} 477 478$ prog --foo 10 479{"NAME": "10", "--foo": true} 480 481$ prog --foo=10 482"user-error" 483 484 485r"""usage: prog (NAME | --foo) [--bar | NAME] 486 487options: --foo 488options: --bar 489 490""" 491$ prog 10 492{"NAME": ["10"], "--foo": false, "--bar": false} 493 494$ prog 10 20 495{"NAME": ["10", "20"], "--foo": false, "--bar": false} 496 497$ prog --foo --bar 498{"NAME": [], "--foo": true, "--bar": true} 499 500 501r"""Naval Fate. 502 503Usage: 504 prog ship new <name>... 505 prog ship [<name>] move <x> <y> [--speed=<kn>] 506 prog ship shoot <x> <y> 507 prog mine (set|remove) <x> <y> [--moored|--drifting] 508 prog -h | --help 509 prog --version 510 511Options: 512 -h --help Show this screen. 513 --version Show version. 514 --speed=<kn> Speed in knots [default: 10]. 515 --moored Mored (anchored) mine. 516 --drifting Drifting mine. 517 518""" 519$ prog ship Guardian move 150 300 --speed=20 520{"--drifting": false, 521 "--help": false, 522 "--moored": false, 523 "--speed": "20", 524 "--version": false, 525 "<name>": ["Guardian"], 526 "<x>": "150", 527 "<y>": "300", 528 "mine": false, 529 "move": true, 530 "new": false, 531 "remove": false, 532 "set": false, 533 "ship": true, 534 "shoot": false} 535 536 537r"""usage: prog --hello""" 538$ prog --hello 539{"--hello": true} 540 541 542r"""usage: prog [--hello=<world>]""" 543$ prog 544{"--hello": null} 545 546$ prog --hello wrld 547{"--hello": "wrld"} 548 549 550r"""usage: prog [-o]""" 551$ prog 552{"-o": false} 553 554$ prog -o 555{"-o": true} 556 557 558r"""usage: prog [-opr]""" 559$ prog -op 560{"-o": true, "-p": true, "-r": false} 561 562 563r"""usage: prog --aabb | --aa""" 564$ prog --aa 565{"--aabb": false, "--aa": true} 566 567$ prog --a 568"user-error" # not a unique prefix 569 570# 571# Counting number of flags 572# 573 574r"""Usage: prog -v""" 575$ prog -v 576{"-v": true} 577 578 579r"""Usage: prog [-v -v]""" 580$ prog 581{"-v": 0} 582 583$ prog -v 584{"-v": 1} 585 586$ prog -vv 587{"-v": 2} 588 589 590r"""Usage: prog -v ...""" 591$ prog 592"user-error" 593 594$ prog -v 595{"-v": 1} 596 597$ prog -vv 598{"-v": 2} 599 600$ prog -vvvvvv 601{"-v": 6} 602 603 604r"""Usage: prog [-v | -vv | -vvv] 605 606This one is probably most readable user-friednly variant. 607 608""" 609$ prog 610{"-v": 0} 611 612$ prog -v 613{"-v": 1} 614 615$ prog -vv 616{"-v": 2} 617 618$ prog -vvvv 619"user-error" 620 621 622r"""usage: prog [--ver --ver]""" 623$ prog --ver --ver 624{"--ver": 2} 625 626 627# 628# Counting commands 629# 630 631r"""usage: prog [go]""" 632$ prog go 633{"go": true} 634 635 636r"""usage: prog [go go]""" 637$ prog 638{"go": 0} 639 640$ prog go 641{"go": 1} 642 643$ prog go go 644{"go": 2} 645 646$ prog go go go 647"user-error" 648 649r"""usage: prog go...""" 650$ prog go go go go go 651{"go": 5} 652 653# 654# [options] does not include options from usage-pattern 655# 656r"""usage: prog [options] [-a] 657 658options: -a 659 -b 660""" 661$ prog -a 662{"-a": true, "-b": false} 663 664$ prog -aa 665"user-error" 666 667# 668# Test [options] shourtcut 669# 670 671r"""Usage: prog [options] A 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] 715options: 716 -a Add 717 -m <msg> Message 718 719""" 720$ prog -a 721{"-m": null, "-a": true} 722 723# 724# Test options without description 725# 726 727r"""usage: prog --hello""" 728$ prog --hello 729{"--hello": true} 730 731r"""usage: prog [--hello=<world>]""" 732$ prog 733{"--hello": null} 734 735$ prog --hello wrld 736{"--hello": "wrld"} 737 738r"""usage: prog [-o]""" 739$ prog 740{"-o": false} 741 742$ prog -o 743{"-o": true} 744 745r"""usage: prog [-opr]""" 746$ prog -op 747{"-o": true, "-p": true, "-r": false} 748 749r"""usage: git [-v | --verbose]""" 750$ prog -v 751{"-v": true, "--verbose": false} 752 753r"""usage: git remote [-v | --verbose]""" 754$ prog remote -v 755{"remote": true, "-v": true, "--verbose": false} 756 757# 758# Test empty usage pattern 759# 760 761r"""usage: prog""" 762$ prog 763{} 764 765r"""usage: prog 766 prog <a> <b> 767""" 768$ prog 1 2 769{"<a>": "1", "<b>": "2"} 770 771$ prog 772{"<a>": null, "<b>": null} 773 774r"""usage: prog <a> <b> 775 prog 776""" 777$ prog 778{"<a>": null, "<b>": null} 779 780# 781# Option's argument should not capture default value from usage pattern 782# 783 784r"""usage: prog [--file=<f>]""" 785$ prog 786{"--file": null} 787 788r"""usage: prog [--file=<f>] 789 790options: --file <a> 791 792""" 793$ prog 794{"--file": null} 795 796r"""Usage: prog [-a <host:port>] 797 798Options: -a, --address <host:port> TCP address [default: localhost:6283]. 799 800""" 801$ prog 802{"--address": "localhost:6283"} 803 804# 805# If option with argument could be repeated, 806# its arguments should be accumulated into a list 807# 808 809r"""usage: prog --long=<arg> ...""" 810 811$ prog --long one 812{"--long": ["one"]} 813 814$ prog --long one --long two 815{"--long": ["one", "two"]} 816 817# 818# Test multiple elements repeated at once 819# 820 821r"""usage: prog (go <direction> --speed=<km/h>)...""" 822$ prog go left --speed=5 go right --speed=9 823{"go": 2, "<direction>": ["left", "right"], "--speed": ["5", "9"]} 824 825# 826# Required options should work with option shortcut 827# 828 829r"""usage: prog [options] -a 830 831options: -a 832 833""" 834$ prog -a 835{"-a": true} 836 837# 838# If option could be repeated its defaults should be split into a list 839# 840 841r"""usage: prog [-o <o>]... 842 843options: -o <o> [default: x] 844 845""" 846$ prog -o this -o that 847{"-o": ["this", "that"]} 848 849$ prog 850{"-o": ["x"]} 851 852r"""usage: prog [-o <o>]... 853 854options: -o <o> [default: x y] 855 856""" 857$ prog -o this 858{"-o": ["this"]} 859 860$ prog 861{"-o": ["x", "y"]} 862 863# 864# Test stacked option's argument 865# 866 867r"""usage: prog -pPATH 868 869options: -p PATH 870 871""" 872$ prog -pHOME 873{"-p": "HOME"} 874 875# 876# Issue 56: Repeated mutually exclusive args give nested lists sometimes 877# 878 879r"""Usage: foo (--xx=x|--yy=y)...""" 880$ prog --xx=1 --yy=2 881{"--xx": ["1"], "--yy": ["2"]} 882 883# 884# POSIXly correct tokenization 885# 886 887r"""usage: prog [<input file>]""" 888$ prog f.txt 889{"<input file>": "f.txt"} 890 891r"""usage: prog [--input=<file name>]...""" 892$ prog --input a.txt --input=b.txt 893{"--input": ["a.txt", "b.txt"]} 894 895# 896# Issue 85: `[options]` shourtcut with multiple subcommands 897# 898 899r"""usage: prog good [options] 900 prog fail [options] 901 902options: --loglevel=N 903 904""" 905$ prog fail --loglevel 5 906{"--loglevel": "5", "fail": true, "good": false} 907 908# 909# Usage-section syntax 910# 911 912r"""usage:prog --foo""" 913$ prog --foo 914{"--foo": true} 915 916r"""PROGRAM USAGE: prog --foo""" 917$ prog --foo 918{"--foo": true} 919 920r"""Usage: prog --foo 921 prog --bar 922NOT PART OF SECTION""" 923$ prog --foo 924{"--foo": true, "--bar": false} 925 926r"""Usage: 927 prog --foo 928 prog --bar 929 930NOT PART OF SECTION""" 931$ prog --foo 932{"--foo": true, "--bar": false} 933 934r"""Usage: 935 prog --foo 936 prog --bar 937NOT PART OF SECTION""" 938$ prog --foo 939{"--foo": true, "--bar": false} 940 941# 942# Options-section syntax 943# 944 945r"""Usage: prog [options] 946 947global options: --foo 948local options: --baz 949 --bar 950other options: 951 --egg 952 --spam 953-not-an-option- 954 955""" 956$ prog --baz --egg 957{"--foo": false, "--baz": true, "--bar": false, "--egg": true, "--spam": false} 958