Issue #18973: Command-line interface of the calendar module now uses argparse

instead of optparse.
This commit is contained in:
Serhiy Storchaka 2015-11-01 17:14:27 +02:00
parent 17bdf2015d
commit 9785261d68
3 changed files with 52 additions and 40 deletions

View File

@ -605,51 +605,63 @@ def timegm(tuple):
def main(args):
import optparse
parser = optparse.OptionParser(usage="usage: %prog [options] [year [month]]")
parser.add_option(
import argparse
parser = argparse.ArgumentParser()
textgroup = parser.add_argument_group('text only arguments')
htmlgroup = parser.add_argument_group('html only arguments')
textgroup.add_argument(
"-w", "--width",
dest="width", type="int", default=2,
help="width of date column (default 2, text only)"
type=int, default=2,
help="width of date column (default 2)"
)
parser.add_option(
textgroup.add_argument(
"-l", "--lines",
dest="lines", type="int", default=1,
help="number of lines for each week (default 1, text only)"
type=int, default=1,
help="number of lines for each week (default 1)"
)
parser.add_option(
textgroup.add_argument(
"-s", "--spacing",
dest="spacing", type="int", default=6,
help="spacing between months (default 6, text only)"
type=int, default=6,
help="spacing between months (default 6)"
)
parser.add_option(
textgroup.add_argument(
"-m", "--months",
dest="months", type="int", default=3,
help="months per row (default 3, text only)"
type=int, default=3,
help="months per row (default 3)"
)
parser.add_option(
htmlgroup.add_argument(
"-c", "--css",
dest="css", default="calendar.css",
help="CSS to use for page (html only)"
default="calendar.css",
help="CSS to use for page"
)
parser.add_option(
parser.add_argument(
"-L", "--locale",
dest="locale", default=None,
default=None,
help="locale to be used from month and weekday names"
)
parser.add_option(
parser.add_argument(
"-e", "--encoding",
dest="encoding", default=None,
help="Encoding to use for output."
default=None,
help="encoding to use for output"
)
parser.add_option(
parser.add_argument(
"-t", "--type",
dest="type", default="text",
default="text",
choices=("text", "html"),
help="output type (text or html)"
)
parser.add_argument(
"year",
nargs='?', type=int,
help="year number (1-9999)"
)
parser.add_argument(
"month",
nargs='?', type=int,
help="month number (1-12, text only)"
)
(options, args) = parser.parse_args(args)
options = parser.parse_args(args[1:])
if options.locale and not options.encoding:
parser.error("if --locale is specified --encoding is required")
@ -667,10 +679,10 @@ def main(args):
encoding = sys.getdefaultencoding()
optdict = dict(encoding=encoding, css=options.css)
write = sys.stdout.buffer.write
if len(args) == 1:
if options.year is None:
write(cal.formatyearpage(datetime.date.today().year, **optdict))
elif len(args) == 2:
write(cal.formatyearpage(int(args[1]), **optdict))
elif options.month is None:
write(cal.formatyearpage(options.year, **optdict))
else:
parser.error("incorrect number of arguments")
sys.exit(1)
@ -680,18 +692,15 @@ def main(args):
else:
cal = TextCalendar()
optdict = dict(w=options.width, l=options.lines)
if len(args) != 3:
if options.month is None:
optdict["c"] = options.spacing
optdict["m"] = options.months
if len(args) == 1:
if options.year is None:
result = cal.formatyear(datetime.date.today().year, **optdict)
elif len(args) == 2:
result = cal.formatyear(int(args[1]), **optdict)
elif len(args) == 3:
result = cal.formatmonth(int(args[1]), int(args[2]), **optdict)
elif options.month is None:
result = cal.formatyear(options.year, **optdict)
else:
parser.error("incorrect number of arguments")
sys.exit(1)
result = cal.formatmonth(options.year, options.month, **optdict)
write = sys.stdout.write
if options.encoding:
result = result.encode(options.encoding)

View File

@ -702,19 +702,19 @@ class CommandLineTestCase(unittest.TestCase):
def assertFailure(self, *args):
rc, stdout, stderr = assert_python_failure('-m', 'calendar', *args)
self.assertIn(b'Usage:', stderr)
self.assertIn(b'usage:', stderr)
self.assertEqual(rc, 2)
def test_help(self):
stdout = self.run_ok('-h')
self.assertIn(b'Usage:', stdout)
self.assertIn(b'usage:', stdout)
self.assertIn(b'calendar.py', stdout)
self.assertIn(b'--help', stdout)
def test_illegal_arguments(self):
self.assertFailure('-z')
#self.assertFailure('spam')
#self.assertFailure('2004', 'spam')
self.assertFailure('spam')
self.assertFailure('2004', 'spam')
self.assertFailure('-t', 'html', '2004', '1')
def test_output_current_year(self):

View File

@ -66,6 +66,9 @@ Core and Builtins
Library
-------
- Issue #18973: Command-line interface of the calendar module now uses argparse
instead of optparse.
- Issue #25510: fileinput.FileInput.readline() now returns b'' instead of ''
at the end if the FileInput was opened with binary mode.
Patch by Ryosuke Ito.