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
2 changes: 2 additions & 0 deletions src/fastapi_cloud_cli/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from .commands.env import env_app
from .commands.login import login
from .commands.logout import logout
from .commands.unlink import unlink
from .commands.whoami import whoami
from .logging import setup_logging
from .utils.sentry import init_sentry
Expand All @@ -20,6 +21,7 @@
app.command()(login)
app.command()(logout)
app.command()(whoami)
app.command()(unlink)

app.add_typer(env_app, name="env")

Expand Down
8 changes: 7 additions & 1 deletion src/fastapi_cloud_cli/commands/deploy.py
Original file line number Diff line number Diff line change
Expand Up @@ -586,7 +586,13 @@ def deploy(
"App not found. Make sure you're logged in the correct account."
)

raise typer.Exit(1)
if not app:
toolkit.print_line()
toolkit.print(
"If you deleted this app, you can run [bold]fastapi unlink[/] to unlink the local configuration.",
tag="tip",
)
raise typer.Exit(1)

logger.debug("Creating archive for deployment")
archive_path = archive(path or Path.cwd()) # noqa: F841
Expand Down
29 changes: 29 additions & 0 deletions src/fastapi_cloud_cli/commands/unlink.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import logging
import shutil
from pathlib import Path
from typing import Any

import typer

from fastapi_cloud_cli.utils.cli import get_rich_toolkit

logger = logging.getLogger(__name__)


def unlink() -> Any:
"""
Unlink by deleting the `.fastapicloud` directory.
"""
with get_rich_toolkit(minimal=True) as toolkit:
config_dir = Path.cwd() / ".fastapicloud"

if not config_dir.exists():
toolkit.print(
"No FastAPI Cloud configuration found in the current directory."
)
logger.debug(f"Configuration directory not found: {config_dir}")
raise typer.Exit(1)

shutil.rmtree(config_dir)
toolkit.print("FastAPI Cloud configuration has been unlinked successfully! 🚀")
logger.debug(f"Deleted configuration directory: {config_dir}")
50 changes: 50 additions & 0 deletions tests/test_cli_unlink.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from pathlib import Path
from unittest.mock import patch

from typer.testing import CliRunner

from fastapi_cloud_cli.cli import app

runner = CliRunner()


def test_unlink_removes_fastapicloud_dir(tmp_path: Path) -> None:
config_dir = tmp_path / ".fastapicloud"
config_dir.mkdir(parents=True)

cloud_json = config_dir / "cloud.json"
cloud_json.write_text('{"app_id": "123", "team_id": "456"}')

readme_file = config_dir / "README.md"
readme_file.write_text("# FastAPI Cloud Configuration")

gitignore_file = config_dir / ".gitignore"
gitignore_file.write_text("*")

with patch("fastapi_cloud_cli.commands.unlink.Path.cwd", return_value=tmp_path):
result = runner.invoke(app, ["unlink"])

assert result.exit_code == 0
assert (
"FastAPI Cloud configuration has been unlinked successfully! 🚀"
in result.output
)

assert not config_dir.exists()
assert not cloud_json.exists()
assert not readme_file.exists()
assert not gitignore_file.exists()


def test_unlink_when_no_configuration_exists(tmp_path: Path) -> None:
config_dir = tmp_path / ".fastapicloud"
assert not config_dir.exists()

with patch("fastapi_cloud_cli.commands.unlink.Path.cwd", return_value=tmp_path):
result = runner.invoke(app, ["unlink"])

assert result.exit_code == 1
assert (
"No FastAPI Cloud configuration found in the current directory."
in result.output
)