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