[getopt-sig] commands on the command line
A.T. Hofkamp
a.t.hofkamp@tue.nl
Mon, 4 Mar 2002 14:48:20 +0100 (CET)
This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.
Send mail to mime@docserver.cac.washington.edu for more info.
---1685886401-826736995-1015249700=:3699
Content-Type: TEXT/PLAIN; charset=US-ASCII
Hello all,
I've been thinking about commands on the command line. For example in cvs:
cvs [cvs-options] command [command-options-and-arguments]
Currently, we don't consider commands. However, that didn't feel right to me....
The basic idea that I thought is that a command is not very different from an
option. Both are a single words that we must recognize.
The only difference between options and commands is that occurrence of the
latter may cause a change in which options and commands we recognize.
That is, it should be possible to modify the recognition of options and
commands while processing. I didn't see any fundamental obstacles to this
approach. The longer I thought about it, the better it became, so it was worth
an experiment, which turned out very nicely if I may say so:
As an experiment, I have a list of options and a list of commands that we
'currently' recognize in a class Parser.
The parser gets options and arguments from a Generator class, similar to the
argparser code (I didn't have that code nearby, so I wrote my own version).
The parser offers words from the generator to the 'current' options and
commands using an ismatch() method.
* Options can retrieve the option argument through a 'getargument()' method.
Also, they should store the match, etc, what argtools, Optik, and other option
processing packages currently do. (Since I wasn't interested in that part, my
options just print '--spam detected'.)
* Commands can use 'setopts()' and 'setcmds()' of the parser to modify the
recognized options respectively commands. (There is no fundamental reason why
an option could not modify options and/or commands, but I haven't yet seen any
need for that.)
See also the attached code.
The example understands
opts.py [-v] [--verbose] [-oFILE] [--output=FILE] commit [-c]
opts.py [-v] [--verbose] [-oFILE] [--output=FILE] status [--brief]
opts.py [-v] [--verbose] [-oFILE] [--output=FILE] version
although it only prints recognized options.
Leveling the playing field to recognize any piece of text is quite an
improvement in my opinion. The ability to modify the recognized commands and
options is extremely powerful, it should cover most of our needs.
Also, it makes a new step in making the option-processing package more modular,
which is always good (ok, I'll settle for 'almost always' :-) ).
For example, the "--" which used to be a bit special, is trivial now. Just
consider it a command that throws away all options.
(actuallly, that is what the hard-coded version in the parser object is doing now).
No doubt there are other nice features that I have forgotten now, but they will
pop up in the discussion.
TTFN,
Albert
--
Constructing a computer program is like writing a painting
---1685886401-826736995-1015249700=:3699
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="opts.py"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.33.0203041448201.3699@se-46.wpa.wtb.tue.nl>
Content-Description:
Content-Disposition: attachment; filename="opts.py"
IyEvdXNyL2Jpbi9weXRob24NCiMNCmltcG9ydCBzdHJpbmcsc3lzDQoNCmNs
YXNzIEdlbmVyYXRvcjoNCiAgICBkZWYgX19pbml0X18oc2VsZixjbWRsaW5l
KToNCglzZWxmLmNtZGxpbmU9Y21kbGluZQ0KCXNlbGYuYXJndW1lbnQ9Tm9u
ZQkjICE9Tm9uZTogTmV4dCB0aGluZyBpcyBhbiBvcHRpb24gYXJndW1lbnQN
CglzZWxmLm90aGVyc2hvcnRvcHRzPU5vbmUgIyB3aXRoICcteHl6JywgdGhp
cyBiZWNvbWVzICd5eicNCg0KICAgICMgQ2FsbCBiYWNrIGZyb20gb3B0aW9u
LXJlY29nbml0aW9uIGNvZGUgdG8gZ2V0IG9wdGlvbi1hcmd1bWVudA0KICAg
IGRlZiBnZXRhcmd1bWVudChzZWxmKToNCgkiIiJHZXQgdGhlIGFyZ3VtZW50
IG9mIGFuIG9wdGlvbiIiIg0KCWlmIHNlbGYuYXJndW1lbnQhPU5vbmU6DQoJ
ICAgIHg9c2VsZi5hcmd1bWVudA0KCSAgICBzZWxmLmFyZ3VtZW50PU5vbmUN
CgkgICAgcmV0dXJuIHgNCglpZiBzZWxmLm90aGVyc2hvcnRvcHRzOg0KCSAg
ICB4PXNlbGYub3RoZXJzaG9ydG9wdHMNCgkgICAgc2VsZi5vdGhlcnNob3J0
b3B0cz1Ob25lDQoJICAgIHJldHVybiB4DQoJaWYgc2VsZi5jbWRsaW5lPT1b
XToNCgkgICAgcmFpc2UgIk5vIGFyZ3VtZW50IGF2YWlsYWJsZSINCgl4ID0g
c2VsZi5jbWRsaW5lWzBdDQoJc2VsZi5jbWRsaW5lPXNlbGYuY21kbGluZVsx
Ol0NCglyZXR1cm4geA0KDQogICAgZGVmIGdldHdvcmQoc2VsZik6DQoJIiIi
R2V0IHRoZSBuZXh0IHdvcmQiIiINCglpZiBzZWxmLmFyZ3VtZW50IT1Ob25l
Og0KCSAgICByYWlzZSAiQXJndW1lbnQgbm90IHByb2Nlc3NlZCINCglpZiBz
ZWxmLm90aGVyc2hvcnRvcHRzIT1Ob25lOg0KCSAgICBpZiBsZW4oc2VsZi5v
dGhlcnNob3J0b3B0cyk8MjoNCiAgICAJCXg9Jy0nK3NlbGYub3RoZXJzaG9y
dG9wdHNbMF0NCgkJc2VsZi5vdGhlcnNob3J0b3B0cz1Ob25lDQoJCXJldHVy
biB4DQoJICAgIHg9Jy0nK3NlbGYub3RoZXJzaG9ydG9wdHNbMF0NCgkgICAg
c2VsZi5vdGhlcnNob3J0b3B0cz1zZWxmLm90aGVyc2hvcnRvcHRzWzE6XQ0K
CSAgICByZXR1cm4geA0KCWlmIHNlbGYuY21kbGluZT09W106DQoJICAgIHJl
dHVybiBOb25lCQkjIE5vIHdvcmRzIGxlZnQNCgkgICANCgl3b3JkID0gc2Vs
Zi5jbWRsaW5lWzBdDQoJc2VsZi5jbWRsaW5lPXNlbGYuY21kbGluZVsxOl0N
Cg0KCWlmIHdvcmRbOjJdID09ICctLSc6CSMgd29yZCA9ICctLXh5eicgb3Ig
Jy0teHl6PXFyc3QnDQoJICAgIGVxID0gc3RyaW5nLmZpbmQod29yZCwnPScp
DQoJICAgIGlmIGVxPDA6CQkjICc9JyBub3QgZm91bmQNCgkJcmV0dXJuIHdv
cmQNCgkgICAgZWxzZToNCgkJc2VsZi5hcmd1bWVudCA9IHdvcmRbZXErMTpd
DQoJCXJldHVybiB3b3JkWzplcV0NCglpZiB3b3JkWzoxXSA9PSAnLSc6CSMg
d29yZCA9ICcteHl6Jw0KCSAgICBpZiBsZW4od29yZCk9PTI6DQoJCXJldHVy
biB3b3JkDQoJICAgIHNlbGYub3RoZXJzaG9ydG9wdHM9d29yZFsyOl0NCgkg
ICAgcmV0dXJuIHdvcmRbOjJdDQoJIyB3b3JkIGlzIG5laXRoZXIgc2hvcnQg
b3B0IG5vciBsb25nIG9wdA0KCXJldHVybiB3b3JkDQoJICAgIA0KDQojDQoj
IENsYXNzZXMgZm9yIG1hdGNoaW5nIHRleHQuDQojIFRoZSBvbmx5IGV4dGVy
bmFsbHkgY2FsbGVkIG1ldGhvZCBpcyAnc2VsZi5pc21hdGNoKCknDQojIFRv
IHNlcGVyYXRlIHJlY29nbml0aW9uIGFuZCBhY3Rpb24sIHRoZSAnc2VsZi5l
eGVjdXRlKCknDQojIGlzIGNhbGxlZCBmcm9tIHRoZSAnc2VsZi5pc21hdGNo
KCknIG1ldGhvZCBhZnRlcg0KIyBtYXRjaGluZyB0aGUgdGV4dC4NCiMNCiMg
UmV0dXJuIHZhbHVlcyBmcm9tIGlzbWF0Y2goKToNCiMgMCA9IG5vIG1hdGNo
DQojID4wICBtYXRjaGVkDQojDQoNCiMNCiMgQmFzZSBjbGFzcyBmb3IgYW4g
b3B0aW9uDQojIE5vdCBhIHRydWUgYmFzZSBjbGFzcywgc2luY2UgZXhlY3V0
ZSgpIHNob3VsZCBiZSBlbXB0eSB0aGVuDQojDQpjbGFzcyBPcHRpb246DQog
ICAgZGVmIF9faW5pdF9fKHNlbGYsbm0saGFzYXJnPTApOg0KCXNlbGYubmFt
ZXM9c3RyaW5nLnNwbGl0KG5tKQ0KCXNlbGYuaGFzYXJnPWhhc2FyZw0KICAg
IGRlZiBpc21hdGNoKHNlbGYsd29yZCxwYXJzZXIpOg0KCWlmIHdvcmQgbm90
IGluIHNlbGYubmFtZXM6DQoJICAgIHJldHVybiAwDQogICAgICAgIGlmIHNl
bGYuaGFzYXJnOg0KCSAgICBhcmcgPSBwYXJzZXIuZ2V0YXJndW1lbnQoKQ0K
CSAgICBzZWxmLmV4ZWN1dGUod29yZCsiICIrYXJnLHBhcnNlcikNCgkgICAg
cmV0dXJuIDINCglzZWxmLmV4ZWN1dGUod29yZCxwYXJzZXIpDQoJcmV0dXJu
IDENCiAgICBkZWYgZXhlY3V0ZShzZWxmLHRleHQscGFyc2VyKToNCglwcmlu
dCB0ZXh0KyIgZGV0ZWN0ZWQiDQoNCiMgQmFzZSBjbGFzcyBmb3IgYSAnY29t
bWFuZCcNCiMgSXQgcmVjb2duaXplcyBpdHMgb3duIG5hbWUsIGFuZCBjYWxs
cyBzZWxmLmV4ZWN1dGUoKQ0KY2xhc3MgQ29tbWFuZDoNCiAgICBkZWYgX19p
bml0X18oc2VsZixubSk6DQoJc2VsZi5uYW1lcz1ubQ0KICAgIGRlZiBpc21h
dGNoKHNlbGYsd29yZCxwYXJzZXIpOg0KCWlmIHNlbGYubmFtZXM9PXdvcmQ6
DQoJICAgIHNlbGYuZXhlY3V0ZSh3b3JkLHBhcnNlcikNCgkgICAgcmV0dXJu
IDENCglyZXR1cm4gMA0KICAgIGRlZiBleGVjdXRlKHNlbGYsd29yZCxwYXJz
ZXIpOg0KCXBhc3MNCg0KIyBTd2l0Y2ggcmVjb2duaXplZCBvcHRpb25zIGFu
ZCBjb21tYW5kcyBpZiAnbmFtZScgZm91bmQNCmNsYXNzIENvbW1hbmRTd2l0
Y2goQ29tbWFuZCk6DQogICAgZGVmIF9faW5pdF9fKHNlbGYsbmFtZSxuZXdv
cHRzPU5vbmUsbmV3Y21kcz1Ob25lKToNCglzZWxmLm5hbWVzPW5hbWUNCglz
ZWxmLm5ld29wdHM9bmV3b3B0cw0KCXNlbGYubmV3Y21kcz1uZXdjbWRzDQoJ
c2VsZi5tYXRjaGVkPTANCiAgICBkZWYgZXhlY3V0ZShzZWxmLHdvcmQscGFy
c2VyKToNCglzZWxmLm1hdGNoZWQ9MQ0KCWlmIHNlbGYubmV3b3B0cyE9Tm9u
ZToNCgkgICAgcGFyc2VyLnNldG9wdHMoc2VsZi5uZXdvcHRzKQ0KCWlmIHNl
bGYubmV3Y21kcyE9Tm9uZToNCgkgICAgcGFyc2VyLnNldGNtZHMoc2VsZi5u
ZXdjbWRzKQ0KDQojIENvbGxlY3QgZXZlcnl0aGluZyB0aGF0IGlzIG9mZmVy
ZWQNCmNsYXNzIENvbW1hbmRDb2xsZWN0KENvbW1hbmQpOg0KICAgIGRlZiBf
X2luaXRfXyhzZWxmKToNCglDb21tYW5kLl9faW5pdF9fKHNlbGYsJycpDQoJ
c2VsZi5saXN0PVtdDQogICAgZGVmIGlzbWF0Y2goc2VsZixhcmcpOg0KCXNl
bGYuZXhlY3V0ZShhcmcpDQoJcmV0dXJuIDENCiAgICBkZWYgZXhlY3V0ZShz
ZWxmLGFyZyk6DQoJc2VsZi5saXN0LmFwcGVuZChhcmcpDQoNCg0KY2xhc3Mg
UGFyc2VyOg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLGdlbmVyYXRvcixvcHRz
PU5vbmUsY21kcz1Ob25lKToNCglzZWxmLmdlbmVyYXRvciA9IGdlbmVyYXRv
cg0KCXNlbGYub3B0cz1vcHRzDQoJc2VsZi5jbWRzPWNtZHMNCg0KICAgICMg
Q2FsbGVkIGZyb20gT3B0aW9uIGNsYXNzOiBwYXNzIHRocm91Z2gNCiAgICBk
ZWYgZ2V0YXJndW1lbnQoc2VsZik6DQoJcmV0dXJuIHNlbGYuZ2VuZXJhdG9y
LmdldGFyZ3VtZW50KCkNCg0KICAgICMgQ2hhbmdlIHRoZSBjb25maWd1cmF0
aW9uIG9mIHRoZSBwYXJzZXINCiAgICBkZWYgc2V0b3B0cyhzZWxmLG9wdHMp
Og0KCXNlbGYub3B0cz1vcHRzDQogICAgZGVmIHNldGNtZHMoc2VsZixjbWRz
KToNCglzZWxmLmNtZHM9Y21kcw0KDQogICAgZGVmIHByb2Nlc3NfY21kbGlu
ZShzZWxmKToNCiAgICAgICAgd29yZCA9IHNlbGYuZ2VuZXJhdG9yLmdldHdv
cmQoKQ0KCXdoaWxlIHdvcmQhPU5vbmU6DQoJICAgIHNlbGYuX3Byb2Nlc3Nf
d29yZCh3b3JkKQ0KCSAgICB3b3JkID0gc2VsZi5nZW5lcmF0b3IuZ2V0d29y
ZCgpDQoNCiAgICBkZWYgX3Byb2Nlc3Nfd29yZChzZWxmLHdvcmQpOg0KCSIi
IlRyeSB0byBmaW5kIGEgbWF0Y2ggZm9yICd3b3JkJyIiIg0KDQoJI3ByaW50
ICJcbi4uLiBXT1JEOiAiK3dvcmQNCglpZiB3b3JkID09ICctLSc6ICAgICMg
Jy0tJyBtZWFucyAnbm8gb3B0cycNCgkgICAgc2VsZi5vcHRzPU5vbmUNCgkg
ICAgcmV0dXJuDQogICAgICAgIGlmIHNlbGYub3B0cyE9Tm9uZToNCiAgICAJ
ICAgIGZvciBvcHQgaW4gc2VsZi5vcHRzOg0KCQkjcHJpbnQgIi4uLiBUcnlp
bmcgdG8gbWF0Y2ggYWdhaW5zdCBvcHRpb24gJyIrc3RyKG9wdC5uYW1lcykr
IiciDQoJCWlmIG9wdC5pc21hdGNoKHdvcmQsc2VsZik6DQoJCSAgICByZXR1
cm4NCglpZiBzZWxmLmNtZHMhPU5vbmU6DQoJICAgIGZvciBjbWQgaW4gc2Vs
Zi5jbWRzOg0KCQkjcHJpbnQgIi4uLiBUcnlpbmcgdG8gbWF0Y2ggYWdhaW5z
dCBjbWQgJyIrY21kLm5hbWVzKyInIg0KCQlpZiBjbWQuaXNtYXRjaCh3b3Jk
LHNlbGYpOg0KCQkgICAgcmV0dXJuDQoJcmFpc2UgIlVucmVjb2duaXplZCBh
cmd1bWVudCAnIit3b3JkKyInIg0KDQpnZW5lcmljX29wdHMgPSBbIE9wdGlv
bignLXYgLS12ZXJib3NlJywwKSwgT3B0aW9uKCctbyAtLW91dHB1dCcsMSkg
XQkNCmNvbW1pdF9vcHRzID0gWyBPcHRpb24oJy1jJykgXQ0Kc3RhdHVzX29w
dHMgPSBbIE9wdGlvbignLS1icmllZicpIF0NCmNvbGxlY3RfY21kID0gWyBD
b21tYW5kQ29sbGVjdCgpIF0NCmNtZHMgPSBbIENvbW1hbmRTd2l0Y2goJ2Nv
bW1pdCcsY29tbWl0X29wdHMsY29sbGVjdF9jbWQpLA0KICAgICAgICAgQ29t
bWFuZFN3aXRjaCgnc3RhdHVzJyxzdGF0dXNfb3B0cyxjb2xsZWN0X2NtZCks
DQoJIENvbW1hbmRTd2l0Y2goJ3ZlcnNpb24nLFtdLFtdKV0NCg0KaWYgX19u
YW1lX18gPT0gJ19fbWFpbl9fJzoNCiAgICBnZW5lcmF0b3IgPSBHZW5lcmF0
b3Ioc3lzLmFyZ3ZbMTpdKQ0KICAgIHBhcnNlciA9IFBhcnNlcihnZW5lcmF0
b3IsZ2VuZXJpY19vcHRzLGNtZHMpDQogICAgcGFyc2VyLnByb2Nlc3NfY21k
bGluZSgpDQogICAgc3lzLmV4aXQoMCkNCg==
---1685886401-826736995-1015249700=:3699--