summaryrefslogtreecommitdiffstats
path: root/tests/test_subcmds.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_subcmds.py')
-rw-r--r--tests/test_subcmds.py41
1 files changed, 41 insertions, 0 deletions
diff --git a/tests/test_subcmds.py b/tests/test_subcmds.py
index 5ce0776f..2d680fb7 100644
--- a/tests/test_subcmds.py
+++ b/tests/test_subcmds.py
@@ -89,3 +89,44 @@ class AllCommands(unittest.TestCase):
89 msg=f"subcmds/{name}.py: {opt}: only use dashes in " 89 msg=f"subcmds/{name}.py: {opt}: only use dashes in "
90 "options, not underscores", 90 "options, not underscores",
91 ) 91 )
92
93 def test_cli_option_dest(self):
94 """Block redundant dest= arguments."""
95
96 def _check_dest(opt):
97 if opt.dest is None or not opt._long_opts:
98 return
99
100 long = opt._long_opts[0]
101 assert long.startswith("--")
102 # This matches optparse's behavior.
103 implicit_dest = long[2:].replace("-", "_")
104 if implicit_dest == opt.dest:
105 bad_opts.append((str(opt), opt.dest))
106
107 # Hook the option check list.
108 optparse.Option.CHECK_METHODS.insert(0, _check_dest)
109
110 # Gather all the bad options up front so people can see all bad options
111 # instead of failing at the first one.
112 all_bad_opts = {}
113 for name, cls in subcmds.all_commands.items():
114 bad_opts = all_bad_opts[name] = []
115 cmd = cls()
116 # Trigger construction of parser.
117 cmd.OptionParser
118
119 errmsg = None
120 for name, bad_opts in sorted(all_bad_opts.items()):
121 if bad_opts:
122 if not errmsg:
123 errmsg = "Omit redundant dest= when defining options.\n"
124 errmsg += f"\nSubcommand {name} (subcmds/{name}.py):\n"
125 errmsg += "".join(
126 f" {opt}: dest='{dest}'\n" for opt, dest in bad_opts
127 )
128 if errmsg:
129 self.fail(errmsg)
130
131 # Make sure we aren't popping the wrong stuff.
132 assert optparse.Option.CHECK_METHODS.pop(0) is _check_dest