summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2024-02-05 22:41:34 (GMT)
committerGitHub <noreply@github.com>2024-02-05 22:41:34 (GMT)
commitbb57ffdb38e9e8df8f9ea71f1430dbbe4bf2d3ac (patch)
treeab97e452b3e97ebc5375ba2229e5cf45707935f7 /Lib/test
parentc32bae52904723d99e1f98e2ef54570268d86467 (diff)
downloadcpython-bb57ffdb38e9e8df8f9ea71f1430dbbe4bf2d3ac.zip
cpython-bb57ffdb38e9e8df8f9ea71f1430dbbe4bf2d3ac.tar.gz
cpython-bb57ffdb38e9e8df8f9ea71f1430dbbe4bf2d3ac.tar.bz2
gh-83648: Support deprecation of options, arguments and subcommands in argparse (GH-114086)
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_argparse.py139
1 files changed, 137 insertions, 2 deletions
diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py
index d1f3d40..86d6e81 100644
--- a/Lib/test/test_argparse.py
+++ b/Lib/test/test_argparse.py
@@ -5099,7 +5099,8 @@ class TestStrings(TestCase):
string = (
"Action(option_strings=['--foo', '-a', '-b'], dest='b', "
"nargs='+', const=None, default=42, type='int', "
- "choices=[1, 2, 3], required=False, help='HELP', metavar='METAVAR')")
+ "choices=[1, 2, 3], required=False, help='HELP', "
+ "metavar='METAVAR', deprecated=False)")
self.assertStringEqual(option, string)
def test_argument(self):
@@ -5116,7 +5117,8 @@ class TestStrings(TestCase):
string = (
"Action(option_strings=[], dest='x', nargs='?', "
"const=None, default=2.5, type=%r, choices=[0.5, 1.5, 2.5], "
- "required=True, help='H HH H', metavar='MV MV MV')" % float)
+ "required=True, help='H HH H', metavar='MV MV MV', "
+ "deprecated=False)" % float)
self.assertStringEqual(argument, string)
def test_namespace(self):
@@ -5308,6 +5310,139 @@ class TestTypeFunctionCallOnlyOnce(TestCase):
args = parser.parse_args('--foo spam!'.split())
self.assertEqual(NS(foo='foo_converted'), args)
+
+# ==============================================
+# Check that deprecated arguments output warning
+# ==============================================
+
+class TestDeprecatedArguments(TestCase):
+
+ def test_deprecated_option(self):
+ parser = argparse.ArgumentParser()
+ parser.add_argument('-f', '--foo', deprecated=True)
+
+ with captured_stderr() as stderr:
+ parser.parse_args(['--foo', 'spam'])
+ stderr = stderr.getvalue()
+ self.assertRegex(stderr, "warning: option '--foo' is deprecated")
+ self.assertEqual(stderr.count('is deprecated'), 1)
+
+ with captured_stderr() as stderr:
+ parser.parse_args(['-f', 'spam'])
+ stderr = stderr.getvalue()
+ self.assertRegex(stderr, "warning: option '-f' is deprecated")
+ self.assertEqual(stderr.count('is deprecated'), 1)
+
+ with captured_stderr() as stderr:
+ parser.parse_args(['--foo', 'spam', '-f', 'ham'])
+ stderr = stderr.getvalue()
+ self.assertRegex(stderr, "warning: option '--foo' is deprecated")
+ self.assertRegex(stderr, "warning: option '-f' is deprecated")
+ self.assertEqual(stderr.count('is deprecated'), 2)
+
+ with captured_stderr() as stderr:
+ parser.parse_args(['--foo', 'spam', '--foo', 'ham'])
+ stderr = stderr.getvalue()
+ self.assertRegex(stderr, "warning: option '--foo' is deprecated")
+ self.assertEqual(stderr.count('is deprecated'), 1)
+
+ def test_deprecated_boolean_option(self):
+ parser = argparse.ArgumentParser()
+ parser.add_argument('-f', '--foo', action=argparse.BooleanOptionalAction, deprecated=True)
+
+ with captured_stderr() as stderr:
+ parser.parse_args(['--foo'])
+ stderr = stderr.getvalue()
+ self.assertRegex(stderr, "warning: option '--foo' is deprecated")
+ self.assertEqual(stderr.count('is deprecated'), 1)
+
+ with captured_stderr() as stderr:
+ parser.parse_args(['-f'])
+ stderr = stderr.getvalue()
+ self.assertRegex(stderr, "warning: option '-f' is deprecated")
+ self.assertEqual(stderr.count('is deprecated'), 1)
+
+ with captured_stderr() as stderr:
+ parser.parse_args(['--no-foo'])
+ stderr = stderr.getvalue()
+ self.assertRegex(stderr, "warning: option '--no-foo' is deprecated")
+ self.assertEqual(stderr.count('is deprecated'), 1)
+
+ with captured_stderr() as stderr:
+ parser.parse_args(['--foo', '--no-foo'])
+ stderr = stderr.getvalue()
+ self.assertRegex(stderr, "warning: option '--foo' is deprecated")
+ self.assertRegex(stderr, "warning: option '--no-foo' is deprecated")
+ self.assertEqual(stderr.count('is deprecated'), 2)
+
+ def test_deprecated_arguments(self):
+ parser = argparse.ArgumentParser()
+ parser.add_argument('foo', nargs='?', deprecated=True)
+ parser.add_argument('bar', nargs='?', deprecated=True)
+
+ with captured_stderr() as stderr:
+ parser.parse_args([])
+ stderr = stderr.getvalue()
+ self.assertEqual(stderr.count('is deprecated'), 0)
+
+ with captured_stderr() as stderr:
+ parser.parse_args(['spam'])
+ stderr = stderr.getvalue()
+ self.assertRegex(stderr, "warning: argument 'foo' is deprecated")
+ self.assertEqual(stderr.count('is deprecated'), 1)
+
+ with captured_stderr() as stderr:
+ parser.parse_args(['spam', 'ham'])
+ stderr = stderr.getvalue()
+ self.assertRegex(stderr, "warning: argument 'foo' is deprecated")
+ self.assertRegex(stderr, "warning: argument 'bar' is deprecated")
+ self.assertEqual(stderr.count('is deprecated'), 2)
+
+ def test_deprecated_varargument(self):
+ parser = argparse.ArgumentParser()
+ parser.add_argument('foo', nargs='*', deprecated=True)
+
+ with captured_stderr() as stderr:
+ parser.parse_args([])
+ stderr = stderr.getvalue()
+ self.assertEqual(stderr.count('is deprecated'), 0)
+
+ with captured_stderr() as stderr:
+ parser.parse_args(['spam'])
+ stderr = stderr.getvalue()
+ self.assertRegex(stderr, "warning: argument 'foo' is deprecated")
+ self.assertEqual(stderr.count('is deprecated'), 1)
+
+ with captured_stderr() as stderr:
+ parser.parse_args(['spam', 'ham'])
+ stderr = stderr.getvalue()
+ self.assertRegex(stderr, "warning: argument 'foo' is deprecated")
+ self.assertEqual(stderr.count('is deprecated'), 1)
+
+ def test_deprecated_subparser(self):
+ parser = argparse.ArgumentParser()
+ subparsers = parser.add_subparsers()
+ subparsers.add_parser('foo', aliases=['baz'], deprecated=True)
+ subparsers.add_parser('bar')
+
+ with captured_stderr() as stderr:
+ parser.parse_args(['bar'])
+ stderr = stderr.getvalue()
+ self.assertEqual(stderr.count('is deprecated'), 0)
+
+ with captured_stderr() as stderr:
+ parser.parse_args(['foo'])
+ stderr = stderr.getvalue()
+ self.assertRegex(stderr, "warning: command 'foo' is deprecated")
+ self.assertEqual(stderr.count('is deprecated'), 1)
+
+ with captured_stderr() as stderr:
+ parser.parse_args(['baz'])
+ stderr = stderr.getvalue()
+ self.assertRegex(stderr, "warning: command 'baz' is deprecated")
+ self.assertEqual(stderr.count('is deprecated'), 1)
+
+
# ==================================================================
# Check semantics regarding the default argument and type conversion
# ==================================================================