Commit 9785261d authored by Serhiy Storchaka's avatar Serhiy Storchaka

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

instead of optparse.
parent 17bdf201
...@@ -605,51 +605,63 @@ def timegm(tuple): ...@@ -605,51 +605,63 @@ def timegm(tuple):
def main(args): def main(args):
import optparse import argparse
parser = optparse.OptionParser(usage="usage: %prog [options] [year [month]]") parser = argparse.ArgumentParser()
parser.add_option( textgroup = parser.add_argument_group('text only arguments')
htmlgroup = parser.add_argument_group('html only arguments')
textgroup.add_argument(
"-w", "--width", "-w", "--width",
dest="width", type="int", default=2, type=int, default=2,
help="width of date column (default 2, text only)" help="width of date column (default 2)"
) )
parser.add_option( textgroup.add_argument(
"-l", "--lines", "-l", "--lines",
dest="lines", type="int", default=1, type=int, default=1,
help="number of lines for each week (default 1, text only)" help="number of lines for each week (default 1)"
) )
parser.add_option( textgroup.add_argument(
"-s", "--spacing", "-s", "--spacing",
dest="spacing", type="int", default=6, type=int, default=6,
help="spacing between months (default 6, text only)" help="spacing between months (default 6)"
) )
parser.add_option( textgroup.add_argument(
"-m", "--months", "-m", "--months",
dest="months", type="int", default=3, type=int, default=3,
help="months per row (default 3, text only)" help="months per row (default 3)"
) )
parser.add_option( htmlgroup.add_argument(
"-c", "--css", "-c", "--css",
dest="css", default="calendar.css", default="calendar.css",
help="CSS to use for page (html only)" help="CSS to use for page"
) )
parser.add_option( parser.add_argument(
"-L", "--locale", "-L", "--locale",
dest="locale", default=None, default=None,
help="locale to be used from month and weekday names" help="locale to be used from month and weekday names"
) )
parser.add_option( parser.add_argument(
"-e", "--encoding", "-e", "--encoding",
dest="encoding", default=None, default=None,
help="Encoding to use for output." help="encoding to use for output"
) )
parser.add_option( parser.add_argument(
"-t", "--type", "-t", "--type",
dest="type", default="text", default="text",
choices=("text", "html"), choices=("text", "html"),
help="output type (text or 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: if options.locale and not options.encoding:
parser.error("if --locale is specified --encoding is required") parser.error("if --locale is specified --encoding is required")
...@@ -667,10 +679,10 @@ def main(args): ...@@ -667,10 +679,10 @@ def main(args):
encoding = sys.getdefaultencoding() encoding = sys.getdefaultencoding()
optdict = dict(encoding=encoding, css=options.css) optdict = dict(encoding=encoding, css=options.css)
write = sys.stdout.buffer.write write = sys.stdout.buffer.write
if len(args) == 1: if options.year is None:
write(cal.formatyearpage(datetime.date.today().year, **optdict)) write(cal.formatyearpage(datetime.date.today().year, **optdict))
elif len(args) == 2: elif options.month is None:
write(cal.formatyearpage(int(args[1]), **optdict)) write(cal.formatyearpage(options.year, **optdict))
else: else:
parser.error("incorrect number of arguments") parser.error("incorrect number of arguments")
sys.exit(1) sys.exit(1)
...@@ -680,18 +692,15 @@ def main(args): ...@@ -680,18 +692,15 @@ def main(args):
else: else:
cal = TextCalendar() cal = TextCalendar()
optdict = dict(w=options.width, l=options.lines) optdict = dict(w=options.width, l=options.lines)
if len(args) != 3: if options.month is None:
optdict["c"] = options.spacing optdict["c"] = options.spacing
optdict["m"] = options.months optdict["m"] = options.months
if len(args) == 1: if options.year is None:
result = cal.formatyear(datetime.date.today().year, **optdict) result = cal.formatyear(datetime.date.today().year, **optdict)
elif len(args) == 2: elif options.month is None:
result = cal.formatyear(int(args[1]), **optdict) result = cal.formatyear(options.year, **optdict)
elif len(args) == 3:
result = cal.formatmonth(int(args[1]), int(args[2]), **optdict)
else: else:
parser.error("incorrect number of arguments") result = cal.formatmonth(options.year, options.month, **optdict)
sys.exit(1)
write = sys.stdout.write write = sys.stdout.write
if options.encoding: if options.encoding:
result = result.encode(options.encoding) result = result.encode(options.encoding)
......
...@@ -702,19 +702,19 @@ class CommandLineTestCase(unittest.TestCase): ...@@ -702,19 +702,19 @@ class CommandLineTestCase(unittest.TestCase):
def assertFailure(self, *args): def assertFailure(self, *args):
rc, stdout, stderr = assert_python_failure('-m', 'calendar', *args) rc, stdout, stderr = assert_python_failure('-m', 'calendar', *args)
self.assertIn(b'Usage:', stderr) self.assertIn(b'usage:', stderr)
self.assertEqual(rc, 2) self.assertEqual(rc, 2)
def test_help(self): def test_help(self):
stdout = self.run_ok('-h') stdout = self.run_ok('-h')
self.assertIn(b'Usage:', stdout) self.assertIn(b'usage:', stdout)
self.assertIn(b'calendar.py', stdout) self.assertIn(b'calendar.py', stdout)
self.assertIn(b'--help', stdout) self.assertIn(b'--help', stdout)
def test_illegal_arguments(self): def test_illegal_arguments(self):
self.assertFailure('-z') self.assertFailure('-z')
#self.assertFailure('spam') self.assertFailure('spam')
#self.assertFailure('2004', 'spam') self.assertFailure('2004', 'spam')
self.assertFailure('-t', 'html', '2004', '1') self.assertFailure('-t', 'html', '2004', '1')
def test_output_current_year(self): def test_output_current_year(self):
......
...@@ -66,6 +66,9 @@ Core and Builtins ...@@ -66,6 +66,9 @@ Core and Builtins
Library 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 '' - Issue #25510: fileinput.FileInput.readline() now returns b'' instead of ''
at the end if the FileInput was opened with binary mode. at the end if the FileInput was opened with binary mode.
Patch by Ryosuke Ito. Patch by Ryosuke Ito.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment