[Python-checkins] cpython: Issue #18973: Command-line interface of the calendar module now uses argparse

serhiy.storchaka python-checkins at python.org
Sun Nov 1 10:14:49 EST 2015


https://hg.python.org/cpython/rev/9f8b5053e30d
changeset: 98927:9f8b5053e30d
user: Serhiy Storchaka <storchaka at gmail.com>
date: Sun Nov 01 17:14:27 2015 +0200
summary:
 Issue #18973: Command-line interface of the calendar module now uses argparse
instead of optparse.
files:
 Lib/calendar.py | 81 +++++++++++++++------------
 Lib/test/test_calendar.py | 8 +-
 Misc/NEWS | 3 +
 3 files changed, 52 insertions(+), 40 deletions(-)
diff --git a/Lib/calendar.py b/Lib/calendar.py
--- a/Lib/calendar.py
+++ b/Lib/calendar.py
@@ -605,51 +605,63 @@
 
 
 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 @@
 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 @@
 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)
diff --git a/Lib/test/test_calendar.py b/Lib/test/test_calendar.py
--- a/Lib/test/test_calendar.py
+++ b/Lib/test/test_calendar.py
@@ -702,19 +702,19 @@
 
 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):
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -66,6 +66,9 @@
 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.
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /