def test_display_completions(self): parser = ArgumentParser() parser.add_argument("rover", choices=["sojourner", "spirit", "opportunity", "curiosity"], help="help for rover ") parser.add_argument("antenna", choices=["low gain", "high gain"], help="help for antenna") sub = parser.add_subparsers() p = sub.add_parser("list") p.add_argument("-o", "--oh", help="ttt") p.add_argument("-c", "--ch", help="ccc") sub2 = p.add_subparsers() sub2.add_parser("cat", help="list cat") sub2.add_parser("dog", help="list dog") completer = CompletionFinder(parser) completer.rl_complete("", 0) disp = completer.get_display_completions() self.assertEqual("help for rover ", disp.get("spirit", "")) self.assertEqual("help for rover ", disp.get("sojourner", "")) self.assertEqual("", disp.get("low gain", "")) completer.rl_complete('opportunity "low gain" list ', 0) disp = completer.get_display_completions() self.assertEqual("ttt", disp.get("-o --oh", "")) self.assertEqual("list cat", disp.get("cat", "")) completer.rl_complete("opportunity low\\ gain list --", 0) disp = completer.get_display_completions() self.assertEqual("ttt", disp.get("--oh", "")) self.assertEqual("ccc", disp.get("--ch", ""))
def test_repl_subcommand(self): p = ArgumentParser() p.add_argument("--foo") p.add_argument("--bar") s = p.add_subparsers() s.add_parser("list") s.add_parser("set") show = s.add_parser("show") def abc(): pass show.add_argument("--test") ss = show.add_subparsers() de = ss.add_parser("depth") de.set_defaults(func=abc) c = CompletionFinder(p, always_complete_options=True) expected_outputs = ( ("", ["-h", "--help", "--foo", "--bar", "list", "show", "set"]), ("li", ["list "]), ("s", ["show", "set"]), ("show ", ["--test", "depth", "-h", "--help"]), ("show d", ["depth "]), ("show depth ", ["-h", "--help"]), ) for cmd, output in expected_outputs: self.assertEqual(set(self.run_completer(p, c, cmd)), set(output))
def test_repl_multiple_complete(self): p = ArgumentParser() p.add_argument("--foo") p.add_argument("--bar") c = CompletionFinder(p, always_complete_options=True) completions = self.run_completer(p, c, "prog ") assert (set(completions) == set(["-h", "--help", "--foo", "--bar"])) completions = self.run_completer(p, c, "prog --") assert (set(completions) == set(["--help", "--foo", "--bar"]))
def test_repl_parse_after_complete(self): p = ArgumentParser() p.add_argument("--foo") p.add_argument("--bar") c = CompletionFinder(p, always_complete_options=True) completions = self.run_completer(p, c, "prog ") assert (set(completions) == set(["-h", "--help", "--foo", "--bar"])) args = p.parse_args(["--foo", "spam"]) assert (args.foo == "spam")
def _get_completions(self, parser, vanilla=False): bio = BytesIO() with mute_stderr(): if vanilla: CompletionFinder()(parser, exit_method=lambda x: None, output_stream=bio) else: ArgCompletionFinder()(parser, exit_method=lambda x: None, output_stream=bio) return bio.getvalue().decode(locale.getpreferredencoding()).split(IFS)
def test_repl_reuse_parser_with_positional(self): p = ArgumentParser() p.add_argument("foo", choices=["aa", "bb", "cc"]) p.add_argument("bar", choices=["d", "e"]) c = CompletionFinder(p, always_complete_options=True) self.assertEqual(set(self.run_completer(p, c, "")), set(["-h", "--help", "aa", "bb", "cc"])) self.assertEqual(set(self.run_completer(p, c, "aa ")), set(["-h", "--help", "d", "e"])) self.assertEqual(set(self.run_completer(p, c, "")), set(["-h", "--help", "aa", "bb", "cc"]))
def test_repl_subparser_parse_after_complete(self): p = ArgumentParser() sp = p.add_subparsers().add_parser("foo") sp.add_argument("bar", choices=["bar"]) c = CompletionFinder(p, always_complete_options=True) completions = self.run_completer(p, c, "prog foo ") assert(set(completions) == set(["-h", "--help", "bar"])) args = p.parse_args(["foo", "bar"]) assert(args.bar == "bar") # "bar" is required - check the parser still enforces this. with self.assertRaises(SystemExit): p.parse_args(["foo"])
def test_readline_entry_point(self): def get_readline_completions(completer, text): completions = [] for i in range(9999): completion = completer.rl_complete(text, i) if completion is None: break completions.append(completion) return completions parser = ArgumentParser() parser.add_argument("rover", choices=["sojourner", "spirit", "opportunity", "curiosity"]) parser.add_argument("antenna", choices=["low gain", "high gain"]) completer = CompletionFinder(parser) self.assertEqual(get_readline_completions(completer, ""), ["-h", "--help", "sojourner", "spirit", "opportunity", "curiosity"]) self.assertEqual(get_readline_completions(completer, "s"), ["sojourner", "spirit"]) self.assertEqual(get_readline_completions(completer, "x"), [])
def test_repl_parse_after_complete(self): p = ArgumentParser() p.add_argument("--foo", required=True) p.add_argument("bar", choices=["bar"]) c = CompletionFinder(p, always_complete_options=True) completions = self.run_completer(p, c, "prog ") assert(set(completions) == set(["-h", "--help", "--foo", "bar"])) args = p.parse_args(["--foo", "spam", "bar"]) assert(args.foo == "spam") assert(args.bar == "bar") # Both options are required - check the parser still enforces this. with self.assertRaises(SystemExit): p.parse_args(["--foo", "spam"]) with self.assertRaises(SystemExit): p.parse_args(["bar"])
def test_display_completions(self): parser = ArgumentParser() parser.add_argument( "rover", choices=["sojourner", "spirit", "opportunity", "curiosity"], help="help for rover ") parser.add_argument("antenna", choices=["low gain", "high gain"], help="help for antenna") sub = parser.add_subparsers() p = sub.add_parser("list") p.add_argument("-o", "--oh", help="ttt") p.add_argument("-c", "--ch", help="ccc") sub2 = p.add_subparsers() sub2.add_parser("cat", help="list cat") sub2.add_parser("dog", help="list dog") completer = CompletionFinder(parser) completer.rl_complete("", 0) disp = completer.get_display_completions() self.assertEqual("help for rover ", disp.get("spirit", "")) self.assertEqual("help for rover ", disp.get("sojourner", "")) self.assertEqual("", disp.get("low gain", "")) completer.rl_complete('opportunity "low gain" list ', 0) disp = completer.get_display_completions() self.assertEqual("ttt", disp.get("-o --oh", "")) self.assertEqual("list cat", disp.get("cat", "")) completer.rl_complete("opportunity low\\ gain list --", 0) disp = completer.get_display_completions() self.assertEqual("ttt", disp.get("--oh", "")) self.assertEqual("ccc", disp.get("--ch", ""))