You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.6 KiB
76 lines
2.6 KiB
class GetoptError(Exception):
|
|
pass
|
|
|
|
def w_getopt(args, options):
|
|
"""A getopt for Windows.
|
|
|
|
Options may start with either '-' or '/', the option names may
|
|
have more than one letter (/tlb or -RegServer), and option names
|
|
are case insensitive.
|
|
|
|
Returns two elements, just as getopt.getopt. The first is a list
|
|
of (option, value) pairs in the same way getopt.getopt does, but
|
|
there is no '-' or '/' prefix to the option name, and the option
|
|
name is always lower case. The second is the list of arguments
|
|
which do not belong to an option.
|
|
|
|
Different from getopt.getopt, a single argument not belonging to an option
|
|
does not terminate parsing.
|
|
"""
|
|
opts = []
|
|
arguments = []
|
|
while args:
|
|
if args[0][:1] in "/-":
|
|
arg = args[0][1:] # strip the '-' or '/'
|
|
arg = arg.lower()
|
|
|
|
if arg + ':' in options:
|
|
try:
|
|
opts.append((arg, args[1]))
|
|
except IndexError:
|
|
raise GetoptError("option '%s' requires an argument" % args[0])
|
|
args = args[1:]
|
|
elif arg in options:
|
|
opts.append((arg, ''))
|
|
else:
|
|
raise GetoptError("invalid option '%s'" % args[0])
|
|
args = args[1:]
|
|
else:
|
|
arguments.append(args[0])
|
|
args = args[1:]
|
|
|
|
return opts, arguments
|
|
|
|
if __debug__:
|
|
if __name__ == "__main__":
|
|
import unittest
|
|
|
|
class TestCase(unittest.TestCase):
|
|
def test_1(self):
|
|
args = "-embedding spam /RegServer foo /UnregSERVER blabla".split()
|
|
opts, args = w_getopt(args,
|
|
"regserver unregserver embedding".split())
|
|
self.assertEqual(opts,
|
|
[('embedding', ''),
|
|
('regserver', ''),
|
|
('unregserver', '')])
|
|
self.assertEqual(args, ["spam", "foo", "blabla"])
|
|
|
|
def test_2(self):
|
|
args = "/TLB Hello.Tlb HELLO.idl".split()
|
|
opts, args = w_getopt(args, ["tlb:"])
|
|
self.assertEqual(opts, [('tlb', 'Hello.Tlb')])
|
|
self.assertEqual(args, ['HELLO.idl'])
|
|
|
|
def test_3(self):
|
|
# Invalid option
|
|
self.assertRaises(GetoptError, w_getopt,
|
|
"/TLIB hello.tlb hello.idl".split(), ["tlb:"])
|
|
|
|
def test_4(self):
|
|
# Missing argument
|
|
self.assertRaises(GetoptError, w_getopt,
|
|
"/TLB".split(), ["tlb:"])
|
|
|
|
unittest.main()
|