Skip to content

Commit 0b18221

Browse files
tct123ndonkoHenri
andauthored
feat(cli): flet -V as alternative to flet --version (#4791)
* Update cli.py * rename -v by -V (shortcut for --version) * reformat and cleanup --------- Co-authored-by: ndonkoHenri <[email protected]> Co-authored-by: TheEthicalBoy <[email protected]>
1 parent 111b8f9 commit 0b18221

File tree

3 files changed

+58
-53
lines changed

3 files changed

+58
-53
lines changed

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

+50-48
Original file line numberDiff line numberDiff line change
@@ -13,78 +13,80 @@
1313

1414

1515
# 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()`.
2022
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.
2327
"""
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)
2959
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)
6261

6362

6463
def main():
6564
parser = argparse.ArgumentParser()
6665
parser.add_argument(
6766
"--version",
67+
"-V",
6868
action="version",
6969
version=flet.version.version if flet.version.version else update_version(),
7070
)
71+
7172
sp = parser.add_subparsers(dest="command")
72-
# sp.default = "run"
7373

7474
flet_cli.commands.create.Command.register_to(sp, "create")
7575
flet_cli.commands.run.Command.register_to(sp, "run")
76+
flet_cli.commands.build.Command.register_to(sp, "build")
7677
flet_cli.commands.pack.Command.register_to(sp, "pack")
7778
flet_cli.commands.publish.Command.register_to(sp, "publish")
78-
flet_cli.commands.build.Command.register_to(sp, "build")
7979
flet_cli.commands.doctor.Command.register_to(sp, "doctor") # Register the doctor command
80-
parser.set_default_subparser("run", positional_args=1)
8180

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
8385
if len(sys.argv) == 1:
8486
parser.print_help(sys.stdout)
8587
sys.exit(1)
8688

87-
# parse args
89+
# parse arguments
8890
args = parser.parse_args()
8991

9092
# execute command

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@
44
import sys
55
from pathlib import Path
66

7-
import flet_cli.__pyinstaller.config as hook_config
87
from flet.utils import is_macos, is_windows
8+
9+
import flet_cli.__pyinstaller.config as hook_config
910
from flet_cli.commands.base import BaseCommand
1011

1112

1213
class Command(BaseCommand):
1314
"""
14-
Package Flet app to a standalone bundle.
15+
Package Flet app to a desktop standalone bundle.
1516
"""
1617

1718
def add_arguments(self, parser: argparse.ArgumentParser) -> None:
@@ -176,6 +177,7 @@ def handle(self, options: argparse.Namespace) -> None:
176177

177178
try:
178179
import PyInstaller.__main__
180+
179181
from flet_cli.__pyinstaller.utils import copy_flet_bin
180182

181183
pyi_args = [options.script, "--noconfirm"]

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

+4-3
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,16 @@
1919
open_in_browser,
2020
random_string,
2121
)
22-
from flet_cli.commands.base import BaseCommand
23-
from flet_cli.utils.pyproject_toml import load_pyproject_toml
2422
from watchdog.events import FileSystemEventHandler
2523
from watchdog.observers import Observer
2624

25+
from flet_cli.commands.base import BaseCommand
26+
from flet_cli.utils.pyproject_toml import load_pyproject_toml
27+
2728

2829
class Command(BaseCommand):
2930
"""
30-
Run Flet app.
31+
Run a Flet app in hot-reload mode.
3132
"""
3233

3334
def add_arguments(self, parser: argparse.ArgumentParser) -> None:

0 commit comments

Comments
 (0)