[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