Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions src/fastapi_cloud_cli/_app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from typing import Annotated

import typer
from rich import print

from fastapi_cloud_cli import __version__

app = typer.Typer(rich_markup_mode="rich")


def version_callback(value: bool) -> None:
if value:
print(f"FastAPI Cloud CLI version: [green]{__version__}[/green]")
raise typer.Exit()


cloud_app = typer.Typer(
rich_markup_mode="rich",
help="Manage [bold]FastAPI[/bold] Cloud deployments.",
no_args_is_help=True,
)


@cloud_app.callback()
def cloud_main(
version: Annotated[
bool,
typer.Option(
"--version",
callback=version_callback,
is_eager=True,
help="Show the version and exit.",
),
] = False,
) -> None: ...
132 changes: 59 additions & 73 deletions src/fastapi_cloud_cli/cli.py
Original file line number Diff line number Diff line change
@@ -1,74 +1,64 @@
from typing import Annotated

import typer
from rich import print

from . import __version__
from .commands.apps import apps_app
from .commands.apps.link import link_app
from .commands.apps.unlink import unlink_app
from .commands.auth import auth_app
from .commands.ci import ci_app
from .commands.deploy import deploy
from .commands.deployments import deployments_app
from .commands.domains import domains_app
from .commands.env import env_app
from .commands.integrations import integrations_app
from .commands.login import login
from .commands.logout import logout
from .commands.logs import logs
from .commands.setup_ci import setup_ci
from .commands.teams import teams_app
from .commands.tokens import tokens_app
from .commands.whoami import whoami
from .logging import setup_logging
from .utils.sentry import init_sentry

setup_logging()

app = typer.Typer(rich_markup_mode="rich")


def version_callback(value: bool) -> None:
if value:
print(f"FastAPI Cloud CLI version: [green]{__version__}[/green]")
raise typer.Exit()


cloud_app = typer.Typer(
rich_markup_mode="rich",
help="Manage [bold]FastAPI[/bold] Cloud deployments.",
no_args_is_help=True,
# Import decorated callbacks so they register themselves with their Typer apps.
from fastapi_cloud_cli._app import app as app
from fastapi_cloud_cli._app import cloud_app as cloud_app
from fastapi_cloud_cli.commands.apps._app import apps_app
from fastapi_cloud_cli.commands.apps.create import create_app as create_app
from fastapi_cloud_cli.commands.apps.get import get_app as get_app
from fastapi_cloud_cli.commands.apps.link import link_app as link_app
from fastapi_cloud_cli.commands.apps.list import list_apps as list_apps
from fastapi_cloud_cli.commands.apps.unlink import unlink_app as unlink_app
from fastapi_cloud_cli.commands.apps.update import update_app as update_app
from fastapi_cloud_cli.commands.auth._app import auth_app
from fastapi_cloud_cli.commands.auth.wait import wait as wait
from fastapi_cloud_cli.commands.ci._app import ci_app
from fastapi_cloud_cli.commands.ci.print_workflow import (
print_workflow as print_workflow,
)
from fastapi_cloud_cli.commands.deploy.command import deploy as deploy
from fastapi_cloud_cli.commands.deployments import deployments_app
from fastapi_cloud_cli.commands.domains._app import domains_app
from fastapi_cloud_cli.commands.domains.add import add_domain as add_domain
from fastapi_cloud_cli.commands.domains.get import get_domain as get_domain
from fastapi_cloud_cli.commands.domains.list import list_domains as list_domains
from fastapi_cloud_cli.commands.domains.remove import remove_domain as remove_domain
from fastapi_cloud_cli.commands.domains.restart import restart_domain as restart_domain
from fastapi_cloud_cli.commands.env._app import env_app
from fastapi_cloud_cli.commands.env.delete import delete as delete
from fastapi_cloud_cli.commands.env.get import get_variable as get_variable
from fastapi_cloud_cli.commands.env.list import list_variables as list_variables
from fastapi_cloud_cli.commands.env.set import set as set
from fastapi_cloud_cli.commands.integrations import integrations_app
from fastapi_cloud_cli.commands.integrations.providers.list import (
list_providers as list_providers,
)
from fastapi_cloud_cli.commands.integrations.resources.connect import (
connect_resource as connect_resource,
)
from fastapi_cloud_cli.commands.integrations.resources.disconnect import (
disconnect_resource as disconnect_resource,
)
from fastapi_cloud_cli.commands.integrations.resources.get import (
get_resource as get_resource,
)
from fastapi_cloud_cli.commands.integrations.resources.list import (
list_resources as list_resources,
)
from fastapi_cloud_cli.commands.login import login as login
from fastapi_cloud_cli.commands.logout import logout as logout
from fastapi_cloud_cli.commands.logs import logs as logs
from fastapi_cloud_cli.commands.setup_ci import setup_ci as setup_ci
from fastapi_cloud_cli.commands.teams._app import teams_app
from fastapi_cloud_cli.commands.teams.get import get_team as get_team
from fastapi_cloud_cli.commands.teams.list import list_teams as list_teams
from fastapi_cloud_cli.commands.tokens._app import tokens_app
from fastapi_cloud_cli.commands.tokens.create import create_token as create_token
from fastapi_cloud_cli.commands.tokens.delete import delete_token as delete_token
from fastapi_cloud_cli.commands.tokens.list import list_tokens as list_tokens
from fastapi_cloud_cli.commands.whoami import whoami as whoami
from fastapi_cloud_cli.logging import setup_logging
from fastapi_cloud_cli.utils.sentry import init_sentry


@cloud_app.callback()
def cloud_main(
version: Annotated[
bool,
typer.Option(
"--version",
callback=version_callback,
is_eager=True,
help="Show the version and exit.",
),
] = False,
) -> None: ...


# TODO: use the app structure

# Additional commands

# fastapi cloud [command]
cloud_app.command()(deploy)
cloud_app.command("link")(link_app)
cloud_app.command()(login)
cloud_app.command()(logs)
cloud_app.command()(logout)
cloud_app.command()(whoami)
cloud_app.command("unlink")(unlink_app)
cloud_app.command()(setup_ci)
setup_logging()

cloud_app.add_typer(env_app, name="env")
cloud_app.add_typer(auth_app, name="auth")
Expand All @@ -80,10 +70,6 @@ def cloud_main(
cloud_app.add_typer(teams_app, name="teams")
cloud_app.add_typer(tokens_app, name="tokens")

# fastapi [command]
app.command()(deploy)
app.command()(login)

app.add_typer(cloud_app, name="cloud")


Expand Down
41 changes: 41 additions & 0 deletions src/fastapi_cloud_cli/commands/_auth.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
from dataclasses import dataclass
from typing import Any, cast

from typer._click import Context
from typer.core import TyperCommand

from fastapi_cloud_cli.utils.auth import Identity
from fastapi_cloud_cli.utils.cli import FastAPIRichToolkit, get_rich_toolkit

_CONTEXT_KEY = "fastapi_cloud_cli.user_command"


@dataclass(frozen=True)
class UserCommandContext:
toolkit: FastAPIRichToolkit
identity: Identity


def get_user_command_context(ctx: Context) -> UserCommandContext:
return cast(UserCommandContext, ctx.meta[_CONTEXT_KEY])


class UserCommand(TyperCommand):
def invoke(self, ctx: Context) -> Any:
json_output = bool(ctx.params.get("json_output", False))

with get_rich_toolkit(json_output=json_output) as toolkit:
identity = Identity()

if not identity.is_logged_in():
toolkit.fail(
"not_logged_in",
"No credentials found.",
hint="Run `fastapi cloud login`.",
)

ctx.meta[_CONTEXT_KEY] = UserCommandContext(
toolkit=toolkit,
identity=identity,
)
return super().invoke(ctx)
22 changes: 1 addition & 21 deletions src/fastapi_cloud_cli/commands/apps/__init__.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,3 @@
import typer

from fastapi_cloud_cli.commands.apps.create import create_app
from fastapi_cloud_cli.commands.apps.get import get_app
from fastapi_cloud_cli.commands.apps.link import link_app
from fastapi_cloud_cli.commands.apps.list import list_apps
from fastapi_cloud_cli.commands.apps.unlink import unlink_app
from fastapi_cloud_cli.commands.apps.update import update_app
from fastapi_cloud_cli.commands.logs import logs

apps_app = typer.Typer(
no_args_is_help=True,
help="Manage your FastAPI Cloud apps.",
)
apps_app.command("create")(create_app)
apps_app.command("get")(get_app)
apps_app.command("link")(link_app)
apps_app.command("list")(list_apps)
apps_app.command("logs")(logs)
apps_app.command("unlink")(unlink_app)
apps_app.command("update")(update_app)
from fastapi_cloud_cli.commands.apps._app import apps_app as apps_app

__all__ = ["apps_app"]
6 changes: 6 additions & 0 deletions src/fastapi_cloud_cli/commands/apps/_app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import typer

apps_app = typer.Typer(
no_args_is_help=True,
help="Manage your FastAPI Cloud apps.",
)
Loading