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