Skip to content

Commit 4554fc3

Browse files
committed
Refactor CLI argument parsing and subparser handling
Improves type annotations and refactors the set_default_subparser function to return the modified argument list. Adds a run() function for better testability and separates parser creation logic. The main entry point now calls run() and handles exit codes more cleanly.
1 parent 5c36b0a commit 4554fc3

File tree

1 file changed

+38
-16
lines changed
  • sdk/python/packages/flet-cli/src/flet_cli

1 file changed

+38
-16
lines changed

sdk/python/packages/flet-cli/src/flet_cli/cli.py

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import argparse
22
import sys
3+
from typing import Optional
34

45
import flet.version
56
import flet_cli.commands.build
@@ -14,8 +15,11 @@
1415

1516
# Source https://stackoverflow.com/a/26379693
1617
def set_default_subparser(
17-
parser: argparse.ArgumentParser, name: str, args: list = None, index: int = 0
18-
):
18+
parser: argparse.ArgumentParser,
19+
name: str,
20+
args: Optional[list[str]] = None,
21+
index: int = 0,
22+
) -> list[str]:
1923
"""
2024
Set a default subparser when no subparser is provided.
2125
This should be called after setting up the argument parser but before
@@ -28,9 +32,12 @@ def set_default_subparser(
2832
inserted.
2933
"""
3034

35+
mutate_sys_argv = args is None
36+
current_args = list(sys.argv[1:] if mutate_sys_argv else args)
37+
3138
# exit if help or version flags are present
32-
if any(flag in sys.argv[1:] for flag in {"-h", "--help", "-V", "--version"}):
33-
return
39+
if any(flag in current_args for flag in {"-h", "--help", "-V", "--version"}):
40+
return current_args
3441

3542
# all subparser actions
3643
subparser_actions = [
@@ -45,22 +52,27 @@ def set_default_subparser(
4552
]
4653

4754
# 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
55+
if any(arg in subparser_names for arg in current_args):
56+
return current_args
5057

5158
# if the default subparser doesn't exist, register it in the first subparser action
5259
if (name not in subparser_names) and subparser_actions:
5360
subparser_actions[0].add_parser(name)
5461

5562
# 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)
59-
else:
60-
args.insert(index, name)
63+
current_args.insert(index, name)
64+
65+
if mutate_sys_argv:
66+
sys.argv = [sys.argv[0], *current_args]
67+
68+
return current_args
6169

6270

6371
def main():
72+
sys.exit(run())
73+
74+
75+
def _create_parser() -> argparse.ArgumentParser:
6476
parser = argparse.ArgumentParser()
6577
parser.add_argument(
6678
"--version",
@@ -81,19 +93,29 @@ def main():
8193
sp, "doctor"
8294
) # Register the doctor command
8395

96+
return parser
97+
98+
99+
def run(args: Optional[list[str]] = None) -> int:
100+
parser = _create_parser()
101+
102+
argv = list(args) if args is not None else list(sys.argv[1:])
103+
84104
# set "run" as the default subparser
85-
set_default_subparser(parser, name="run", index=1)
105+
argv = set_default_subparser(parser, name="run", args=argv, index=0)
86106

87107
# print usage/help if called without arguments
88-
if len(sys.argv) == 1:
108+
if not argv:
89109
parser.print_help(sys.stdout)
90-
sys.exit(1)
110+
return 1
91111

92112
# parse arguments
93-
args = parser.parse_args()
113+
namespace = parser.parse_args(argv)
94114

95115
# execute command
96-
args.handler(args)
116+
namespace.handler(namespace)
117+
118+
return 0
97119

98120

99121
if __name__ == "__main__":

0 commit comments

Comments
 (0)