|
13 | 13 |
|
14 | 14 |
|
15 | 15 | # Source https://stackoverflow.com/a/26379693
|
16 |
| -def set_default_subparser(self, name, args=None, positional_args=0): |
17 |
| - """default subparser selection. Call after setup, just before parse_args() |
18 |
| - name: is the name of the subparser to call by default |
19 |
| - args: if set is the argument list handed to parse_args() |
| 16 | +def set_default_subparser( |
| 17 | + parser: argparse.ArgumentParser, name: str, args: list = None, index: int = 0 |
| 18 | +): |
| 19 | + """ |
| 20 | + Set a default subparser when no subparser is provided. |
| 21 | + This should be called after setting up the argument parser but before `parse_args()`. |
20 | 22 |
|
21 |
| - , tested with 2.7, 3.2, 3.3, 3.4 |
22 |
| - it works with 2.6 assuming argparse is installed |
| 23 | + Parameters: |
| 24 | + - name (str): The name of the default subparser to use. |
| 25 | + - args (list, optional): A list of arguments passed to `parse_args()`. Defaults to None. |
| 26 | + - index (int): Position in `sys.argv` where the default subparser should be inserted. Defaults to 0. |
23 | 27 | """
|
24 |
| - subparser_found = False |
25 |
| - existing_default = False # check if default parser previously defined |
26 |
| - for arg in sys.argv[1:]: |
27 |
| - if arg in ["-h", "--help", "--version"]: # global help if no subparser |
28 |
| - break |
| 28 | + |
| 29 | + # exit if help or version flags are present |
| 30 | + if any(flag in sys.argv[1:] for flag in {"-h", "--help", "-V", "--version"}): |
| 31 | + return |
| 32 | + |
| 33 | + # all subparser actions |
| 34 | + subparser_actions = [ |
| 35 | + action |
| 36 | + for action in parser._subparsers._actions |
| 37 | + if isinstance(action, argparse._SubParsersAction) |
| 38 | + ] |
| 39 | + |
| 40 | + # all subparser names |
| 41 | + subparser_names = [ |
| 42 | + sp_name |
| 43 | + for action in subparser_actions |
| 44 | + for sp_name in action._name_parser_map.keys() |
| 45 | + ] |
| 46 | + |
| 47 | + # if an existing subparser is provided, skip setting a default |
| 48 | + if any(arg in subparser_names for arg in sys.argv[1:]): |
| 49 | + return |
| 50 | + |
| 51 | + # if the default subparser doesn't exist, register it in the first subparser action |
| 52 | + if (name not in subparser_names) and subparser_actions: |
| 53 | + subparser_actions[0].add_parser(name) |
| 54 | + |
| 55 | + # insert the default subparser into the appropriate argument list |
| 56 | + if args is None: |
| 57 | + if len(sys.argv) > 1: |
| 58 | + sys.argv.insert(index, name) |
29 | 59 | else:
|
30 |
| - for x in self._subparsers._actions: |
31 |
| - if not isinstance(x, argparse._SubParsersAction): |
32 |
| - continue |
33 |
| - for sp_name in x._name_parser_map.keys(): |
34 |
| - if sp_name in sys.argv[1:]: |
35 |
| - subparser_found = True |
36 |
| - if sp_name == name: # check existance of default parser |
37 |
| - existing_default = True |
38 |
| - if not subparser_found: |
39 |
| - # If the default subparser is not among the existing ones, |
40 |
| - # create a new parser. |
41 |
| - # As this is called just before 'parse_args', the default |
42 |
| - # parser created here will not pollute the help output. |
43 |
| - |
44 |
| - if not existing_default: |
45 |
| - for x in self._subparsers._actions: |
46 |
| - if not isinstance(x, argparse._SubParsersAction): |
47 |
| - continue |
48 |
| - x.add_parser(name) |
49 |
| - break # this works OK, but should I check further? |
50 |
| - |
51 |
| - # insert default in last position before global positional |
52 |
| - # arguments, this implies no global options are specified after |
53 |
| - # first positional argument |
54 |
| - if args is None and len(sys.argv) > 1: |
55 |
| - sys.argv.insert(positional_args, name) |
56 |
| - elif args is not None: |
57 |
| - args.insert(positional_args, name) |
58 |
| - # print(sys.argv) |
59 |
| - |
60 |
| - |
61 |
| -argparse.ArgumentParser.set_default_subparser = set_default_subparser |
| 60 | + args.insert(index, name) |
62 | 61 |
|
63 | 62 |
|
64 | 63 | def main():
|
65 | 64 | parser = argparse.ArgumentParser()
|
66 | 65 | parser.add_argument(
|
67 | 66 | "--version",
|
| 67 | + "-V", |
68 | 68 | action="version",
|
69 | 69 | version=flet.version.version if flet.version.version else update_version(),
|
70 | 70 | )
|
| 71 | + |
71 | 72 | sp = parser.add_subparsers(dest="command")
|
72 |
| - # sp.default = "run" |
73 | 73 |
|
74 | 74 | flet_cli.commands.create.Command.register_to(sp, "create")
|
75 | 75 | flet_cli.commands.run.Command.register_to(sp, "run")
|
| 76 | + flet_cli.commands.build.Command.register_to(sp, "build") |
76 | 77 | flet_cli.commands.pack.Command.register_to(sp, "pack")
|
77 | 78 | flet_cli.commands.publish.Command.register_to(sp, "publish")
|
78 |
| - flet_cli.commands.build.Command.register_to(sp, "build") |
79 | 79 | flet_cli.commands.doctor.Command.register_to(sp, "doctor") # Register the doctor command
|
80 |
| - parser.set_default_subparser("run", positional_args=1) |
81 | 80 |
|
82 |
| - # print usage if called without args |
| 81 | + # set "run" as the default subparser |
| 82 | + set_default_subparser(parser, name="run", index=1) |
| 83 | + |
| 84 | + # print usage/help if called without arguments |
83 | 85 | if len(sys.argv) == 1:
|
84 | 86 | parser.print_help(sys.stdout)
|
85 | 87 | sys.exit(1)
|
86 | 88 |
|
87 |
| - # parse args |
| 89 | + # parse arguments |
88 | 90 | args = parser.parse_args()
|
89 | 91 |
|
90 | 92 | # execute command
|
|
0 commit comments