|
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