Skip to content

Commit ed000ac

Browse files
authored
Merge pull request #37 from aclark4life/main
Refactor with typer
2 parents 7d5a912 + 1f72dcf commit ed000ac

File tree

3 files changed

+498
-180
lines changed

3 files changed

+498
-180
lines changed

django_mongodb_cli/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,12 @@
1818
context_settings={"help_option_names": ["-h", "--help"]},
1919
)
2020

21+
22+
@dm.callback(invoke_without_command=True)
23+
def main(ctx: typer.Context):
24+
if ctx.invoked_subcommand is None:
25+
typer.echo(ctx.get_help())
26+
raise typer.Exit()
27+
28+
2129
dm.add_typer(repo, name="repo")

django_mongodb_cli/repo.py

Lines changed: 156 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,84 @@
11
import typer
22

3-
from .utils import Repo, Test
3+
from .utils import Package, Repo, Test
44

55
repo = typer.Typer()
66

77

8+
def repo_command(
9+
all_repos: bool,
10+
repo_name: str,
11+
all_msg: str,
12+
missing_msg: str,
13+
single_func,
14+
all_func,
15+
fg=typer.colors.CYAN,
16+
repo_list=None,
17+
):
18+
if all_repos:
19+
if all_msg:
20+
typer.echo(typer.style(all_msg, fg=fg))
21+
for name in repo_list if repo_list is not None else Repo().map:
22+
all_func(name)
23+
elif repo_name:
24+
single_func(repo_name)
25+
else:
26+
typer.echo(typer.style(missing_msg, fg=typer.colors.YELLOW))
27+
28+
29+
@repo.callback(invoke_without_command=True)
30+
def main(
31+
ctx: typer.Context,
32+
list_repos: bool = typer.Option(
33+
False, "--list-repos", "-l", help="List available repositories."
34+
),
35+
):
36+
if list_repos:
37+
Repo().list_repos()
38+
raise typer.Exit() # End, no further action
39+
40+
if ctx.invoked_subcommand is None:
41+
typer.echo(ctx.get_help())
42+
raise typer.Exit()
43+
44+
845
@repo.command()
946
def status(
1047
repo_name: str = typer.Argument(None),
1148
all_repos: bool = typer.Option(
1249
False, "--all-repos", "-a", help="Show status of all repos"
1350
),
1451
):
15-
"""Show the status of the specified Git repository."""
16-
if all_repos:
17-
typer.echo(
18-
typer.style("Showing status for all repositories...", fg=typer.colors.CYAN)
19-
)
20-
for repo_name in Repo().map:
21-
Repo().get_repo_status(repo_name)
22-
elif repo_name:
23-
Repo().get_repo_status(repo_name)
24-
else:
25-
typer.echo(
26-
typer.style(
27-
"Please specify a repository name or use --all-repos to show all repositories.",
28-
fg=typer.colors.YELLOW,
29-
)
30-
)
52+
repo_command(
53+
all_repos,
54+
repo_name,
55+
all_msg="Showing status for all repositories...",
56+
missing_msg="Please specify a repository name or use --all-repos to show all repositories.",
57+
single_func=lambda name: Repo().get_repo_status(name),
58+
all_func=lambda name: Repo().get_repo_status(name),
59+
)
60+
61+
62+
@repo.command()
63+
def branch(
64+
repo_name: str = typer.Argument(None),
65+
branch_name: str = typer.Argument(None),
66+
all_repos: bool = typer.Option(
67+
False, "--all-repos", "-a", help="Show branches of all repositories"
68+
),
69+
):
70+
repo = Repo()
71+
if branch_name:
72+
repo.set_branch(branch_name)
73+
74+
repo_command(
75+
all_repos,
76+
repo_name,
77+
all_msg="Showing branches for all repositories...",
78+
missing_msg="Please specify a repository name or use --all-repos to show branches of all repositories.",
79+
single_func=lambda name: repo.get_repo_branches(name),
80+
all_func=lambda name: repo.get_repo_branches(name),
81+
)
3182

3283

3384
@repo.command()
@@ -40,24 +91,45 @@ def clone(
4091
False, "--install", "-i", help="Install after cloning"
4192
),
4293
):
43-
"""Clone the specified Git repository."""
44-
if all_repos:
45-
typer.echo(typer.style("Cloning all repositories...", fg=typer.colors.CYAN))
46-
for repo_name in Repo().map:
47-
Repo().clone_repo(repo_name)
48-
if install:
49-
Repo().install_package(repo_name)
50-
elif repo_name:
51-
Repo().clone_repo(repo_name)
94+
def clone_repo(name):
95+
Repo().clone_repo(name)
5296
if install:
53-
Repo().install_package(repo_name)
54-
else:
55-
typer.echo(
56-
typer.style(
57-
"Please specify a repository name or use --all-repos to clone all repositories.",
58-
fg=typer.colors.YELLOW,
59-
)
60-
)
97+
Package().install_package(name)
98+
99+
repo_command(
100+
all_repos,
101+
repo_name,
102+
all_msg="Cloning all repositories...",
103+
missing_msg="Please specify a repository name or use --all-repos to clone all repositories.",
104+
single_func=clone_repo,
105+
all_func=clone_repo,
106+
)
107+
108+
109+
@repo.command()
110+
def delete(
111+
repo_name: str = typer.Argument(None),
112+
all_repos: bool = typer.Option(
113+
False, "--all-repos", "-a", help="Delete all repositories"
114+
),
115+
uninstall: bool = typer.Option(
116+
False, "--uninstall", "-u", help="Uninstall after deleting"
117+
),
118+
):
119+
def do_delete(name):
120+
if uninstall:
121+
Package().uninstall_package(name)
122+
Repo().delete_repo(name)
123+
124+
repo_command(
125+
all_repos,
126+
repo_name,
127+
all_msg="Deleting all repositories...",
128+
missing_msg="Please specify a repository name or use --all-repos to delete all repositories.",
129+
single_func=do_delete,
130+
all_func=do_delete,
131+
fg=typer.colors.RED, # Red for delete
132+
)
61133

62134

63135
@repo.command()
@@ -67,20 +139,31 @@ def install(
67139
False, "--all-repos", "-a", help="Install all repositories"
68140
),
69141
):
70-
"""Install the specified Git repository."""
71-
if all_repos:
72-
typer.echo(typer.style("Installing all repositories...", fg=typer.colors.CYAN))
73-
for repo_name in Repo().map:
74-
Repo().install_package(repo_name)
75-
elif repo_name:
76-
Repo().install_package(repo_name)
77-
else:
78-
typer.echo(
79-
typer.style(
80-
"Please specify a repository name or use --all-repos to install all repositories.",
81-
fg=typer.colors.YELLOW,
82-
)
83-
)
142+
repo_command(
143+
all_repos,
144+
repo_name,
145+
all_msg="Installing all repositories...",
146+
missing_msg="Please specify a repository name or use --all-repos to install all repositories.",
147+
single_func=lambda name: Package().install_package(name),
148+
all_func=lambda name: Package().install_package(name),
149+
)
150+
151+
152+
@repo.command()
153+
def origin(
154+
repo_name: str = typer.Argument(None),
155+
all_repos: bool = typer.Option(
156+
False, "--all-repos", "-a", help="Show origin of all repositories"
157+
),
158+
):
159+
repo_command(
160+
all_repos,
161+
repo_name,
162+
all_msg="Showing origin for all repositories...",
163+
missing_msg="Please specify a repository name or use --all-repos to show origins of all repositories.",
164+
single_func=lambda name: Repo().get_repo_origin(name),
165+
all_func=lambda name: Repo().get_repo_origin(name),
166+
)
84167

85168

86169
@repo.command()
@@ -90,28 +173,22 @@ def sync(
90173
False, "--all-repos", "-a", help="Sync all repositories"
91174
),
92175
):
93-
"""Sync the specified Git repository."""
94-
if all_repos:
95-
typer.echo(typer.style("Syncing all repositories...", fg=typer.colors.CYAN))
96-
for repo_name in Repo().map:
97-
Repo().sync_repo(repo_name)
98-
elif repo_name:
99-
Repo().sync_repo(repo_name)
100-
else:
101-
typer.echo(
102-
typer.style(
103-
"Please specify a repository name or use --all-repos to sync all repositories.",
104-
fg=typer.colors.YELLOW,
105-
)
106-
)
176+
repo_command(
177+
all_repos,
178+
repo_name,
179+
all_msg="Syncing all repositories...",
180+
missing_msg="Please specify a repository name or use --all-repos to sync all repositories.",
181+
single_func=lambda name: Repo().sync_repo(name),
182+
all_func=lambda name: Repo().sync_repo(name),
183+
)
107184

108185

109186
@repo.command()
110187
def test(
111188
repo_name: str = typer.Argument(None),
112189
modules: list[str] = typer.Argument(None),
113190
all_repos: bool = typer.Option(
114-
False, "--all-repos", "-a", help="Sync all repositories"
191+
False, "--all-repos", "-a", help="Run tests for all repositories"
115192
),
116193
keep_db: bool = typer.Option(
117194
False, "--keepdb", help="Keep the database after tests"
@@ -123,31 +200,25 @@ def test(
123200
False,
124201
"--setenv",
125202
"-s",
126-
help="Set DJANGO_SETTINGS_MODULE" " environment variable",
203+
help="Set DJANGO_SETTINGS_MODULE environment variable",
127204
),
128205
):
129-
"""Run tests for the specified Git repository."""
130-
repo = Test()
206+
test_runner = Test()
131207
if modules:
132-
repo.set_modules(modules)
208+
test_runner.set_modules(modules)
133209
if keep_db:
134-
repo.set_keep_db(keep_db)
210+
test_runner.set_keep_db(keep_db)
135211
if keyword:
136-
repo.set_keyword(keyword)
212+
test_runner.set_keyword(keyword)
137213
if setenv:
138-
repo.set_env(setenv)
139-
if all_repos:
140-
typer.echo(
141-
typer.style("Running tests for all repositories...", fg=typer.colors.CYAN)
142-
)
143-
for repo_name in repo.map:
144-
repo.run_tests(repo_name)
145-
elif repo_name:
146-
repo.run_tests(repo_name)
147-
else:
148-
typer.echo(
149-
typer.style(
150-
"Please specify a repository name or use --all-repos to run tests for all repositories.",
151-
fg=typer.colors.YELLOW,
152-
)
153-
)
214+
test_runner.set_env(setenv)
215+
216+
repo_command(
217+
all_repos,
218+
repo_name,
219+
all_msg="Running tests for all repositories...",
220+
missing_msg="Please specify a repository name or use --all-repos to run tests for all repositories.",
221+
single_func=lambda name: test_runner.run_tests(name),
222+
all_func=lambda name: test_runner.run_tests(name),
223+
repo_list=test_runner.map, # Use Test().map instead of Repo().map
224+
)

0 commit comments

Comments
 (0)