diff --git a/src/fastapi_cloud_cli/api/__init__.py b/src/fastapi_cloud_cli/api/__init__.py new file mode 100644 index 00000000..e89cf905 --- /dev/null +++ b/src/fastapi_cloud_cli/api/__init__.py @@ -0,0 +1,12 @@ +from .client import STREAM_LOGS_MAX_RETRIES as STREAM_LOGS_MAX_RETRIES +from .client import SUCCESSFUL_STATUSES as SUCCESSFUL_STATUSES +from .client import APIClient as APIClient +from .client import AppLogEntry as AppLogEntry +from .client import BuildLogLineMessage as BuildLogLineMessage +from .client import DeploymentStatus as DeploymentStatus +from .client import StreamLogError as StreamLogError +from .client import TooManyRetriesError as TooManyRetriesError +from .client import _get_response_error_message as _get_response_error_message +from .client import get_http_error_code as get_http_error_code +from .client import get_http_error_hint as get_http_error_hint +from .client import handle_http_error as handle_http_error diff --git a/src/fastapi_cloud_cli/utils/api.py b/src/fastapi_cloud_cli/api/client.py similarity index 99% rename from src/fastapi_cloud_cli/utils/api.py rename to src/fastapi_cloud_cli/api/client.py index 5ac27a80..ccdbcf64 100644 --- a/src/fastapi_cloud_cli/utils/api.py +++ b/src/fastapi_cloud_cli/api/client.py @@ -21,10 +21,9 @@ from fastapi_cloud_cli import __version__ from fastapi_cloud_cli.config import Settings +from fastapi_cloud_cli.utils.auth import AuthMode, Identity, delete_auth_config from fastapi_cloud_cli.utils.errors import ErrorCode, ErrorToolkit -from .auth import AuthMode, Identity, delete_auth_config - logger = logging.getLogger(__name__) STREAM_LOGS_MAX_RETRIES = 3 diff --git a/src/fastapi_cloud_cli/commands/_flow.py b/src/fastapi_cloud_cli/commands/_flow.py index 23c3a85e..92038655 100644 --- a/src/fastapi_cloud_cli/commands/_flow.py +++ b/src/fastapi_cloud_cli/commands/_flow.py @@ -6,8 +6,8 @@ from rich_toolkit import RichToolkit from rich_toolkit.progress import Progress +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.config import Settings -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.auth import AuthConfig, AuthMode, write_auth_config from fastapi_cloud_cli.utils.cli import FastAPIRichToolkit diff --git a/src/fastapi_cloud_cli/commands/apps/create.py b/src/fastapi_cloud_cli/commands/apps/create.py index 71a7ce7d..0df7cc01 100644 --- a/src/fastapi_cloud_cli/commands/apps/create.py +++ b/src/fastapi_cloud_cli/commands/apps/create.py @@ -6,11 +6,11 @@ from pydantic import BaseModel, Field from rich_toolkit import RichToolkit +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands.deploy.archive import ( _get_app_name, validate_app_directory, ) -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.apps import AppConfig, write_app_config from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import get_rich_toolkit diff --git a/src/fastapi_cloud_cli/commands/apps/get.py b/src/fastapi_cloud_cli/commands/apps/get.py index f35d332b..8f3c6245 100644 --- a/src/fastapi_cloud_cli/commands/apps/get.py +++ b/src/fastapi_cloud_cli/commands/apps/get.py @@ -6,6 +6,7 @@ from rich.text import Text from rich_toolkit import RichToolkit +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands.apps.list import ( App, _get_app, @@ -13,7 +14,6 @@ _get_team, ) from fastapi_cloud_cli.config import Settings -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.apps import resolve_app_id_or_fail from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import get_details_table, get_rich_toolkit diff --git a/src/fastapi_cloud_cli/commands/apps/link.py b/src/fastapi_cloud_cli/commands/apps/link.py index b219f539..61082828 100644 --- a/src/fastapi_cloud_cli/commands/apps/link.py +++ b/src/fastapi_cloud_cli/commands/apps/link.py @@ -7,8 +7,8 @@ from rich_toolkit import RichToolkit from rich_toolkit.menu import Option +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands.apps.list import _get_app -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.apps import AppConfig, get_app_config, write_app_config from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import FastAPIRichToolkit, get_rich_toolkit diff --git a/src/fastapi_cloud_cli/commands/apps/list.py b/src/fastapi_cloud_cli/commands/apps/list.py index a8394d46..3ede78fa 100644 --- a/src/fastapi_cloud_cli/commands/apps/list.py +++ b/src/fastapi_cloud_cli/commands/apps/list.py @@ -7,8 +7,8 @@ from rich.text import Text from rich_toolkit import RichToolkit +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.config import Settings -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import get_rich_toolkit from fastapi_cloud_cli.utils.execution import JsonOutputOption diff --git a/src/fastapi_cloud_cli/commands/apps/update.py b/src/fastapi_cloud_cli/commands/apps/update.py index f2fd6205..6bdb0f4b 100644 --- a/src/fastapi_cloud_cli/commands/apps/update.py +++ b/src/fastapi_cloud_cli/commands/apps/update.py @@ -5,8 +5,8 @@ from pydantic import BaseModel from rich_toolkit import RichToolkit +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands.deploy.archive import validate_app_directory -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.apps import resolve_app_id_or_fail from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import get_rich_toolkit diff --git a/src/fastapi_cloud_cli/commands/auth/wait.py b/src/fastapi_cloud_cli/commands/auth/wait.py index 2681c97b..a8d8623b 100644 --- a/src/fastapi_cloud_cli/commands/auth/wait.py +++ b/src/fastapi_cloud_cli/commands/auth/wait.py @@ -2,12 +2,12 @@ import typer +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands._flow import ( DEFAULT_LOGIN_TIMEOUT_SECONDS, complete_device_login, render_login_output, ) -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.cli import get_rich_toolkit from fastapi_cloud_cli.utils.execution import JsonOutputOption diff --git a/src/fastapi_cloud_cli/commands/deploy/cloud.py b/src/fastapi_cloud_cli/commands/deploy/cloud.py index d02d9f55..2f28132b 100644 --- a/src/fastapi_cloud_cli/commands/deploy/cloud.py +++ b/src/fastapi_cloud_cli/commands/deploy/cloud.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from fastapi_cloud_cli.utils.api import ( +from fastapi_cloud_cli.api import ( APIClient, DeploymentStatus, _get_response_error_message, diff --git a/src/fastapi_cloud_cli/commands/deploy/command.py b/src/fastapi_cloud_cli/commands/deploy/command.py index dbc2e139..ff3c899c 100644 --- a/src/fastapi_cloud_cli/commands/deploy/command.py +++ b/src/fastapi_cloud_cli/commands/deploy/command.py @@ -6,6 +6,7 @@ import typer from pydantic import BaseModel +from fastapi_cloud_cli.api import APIClient, DeploymentStatus from fastapi_cloud_cli.commands.deploy.archive import _get_large_files, archive from fastapi_cloud_cli.commands.deploy.cloud import ( AppResponse, @@ -18,7 +19,6 @@ from fastapi_cloud_cli.commands.deploy.upload import _cancel_upload, _upload_deployment from fastapi_cloud_cli.commands.deploy.wait import _wait_for_deployment from fastapi_cloud_cli.commands.login import _interactive_login -from fastapi_cloud_cli.utils.api import APIClient, DeploymentStatus from fastapi_cloud_cli.utils.apps import get_app_config from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import FastAPIRichToolkit, get_rich_toolkit diff --git a/src/fastapi_cloud_cli/commands/deploy/configure.py b/src/fastapi_cloud_cli/commands/deploy/configure.py index 55ee76c0..982b12a8 100644 --- a/src/fastapi_cloud_cli/commands/deploy/configure.py +++ b/src/fastapi_cloud_cli/commands/deploy/configure.py @@ -4,6 +4,7 @@ from pydantic import TypeAdapter from rich_toolkit.menu import Option +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands.deploy.archive import AppDirectory, _get_app_name from fastapi_cloud_cli.commands.deploy.cloud import ( AppResponse, @@ -12,7 +13,6 @@ _get_teams, _update_app, ) -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.apps import AppConfig, write_app_config from fastapi_cloud_cli.utils.cli import FastAPIRichToolkit diff --git a/src/fastapi_cloud_cli/commands/deploy/upload.py b/src/fastapi_cloud_cli/commands/deploy/upload.py index 2fcd1d69..94867759 100644 --- a/src/fastapi_cloud_cli/commands/deploy/upload.py +++ b/src/fastapi_cloud_cli/commands/deploy/upload.py @@ -6,8 +6,8 @@ from pydantic import BaseModel from rich_toolkit.progress import Progress +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands.deploy.cloud import CreateDeploymentResponse -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.progress_file import ProgressFile logger = logging.getLogger(__name__) diff --git a/src/fastapi_cloud_cli/commands/deploy/wait.py b/src/fastapi_cloud_cli/commands/deploy/wait.py index ad7f8c27..d97a50ff 100644 --- a/src/fastapi_cloud_cli/commands/deploy/wait.py +++ b/src/fastapi_cloud_cli/commands/deploy/wait.py @@ -6,14 +6,14 @@ from rich.text import Text from rich_toolkit import RichToolkit -from fastapi_cloud_cli.commands.deploy.cloud import CreateDeploymentResponse -from fastapi_cloud_cli.utils.api import ( +from fastapi_cloud_cli.api import ( SUCCESSFUL_STATUSES, APIClient, DeploymentStatus, StreamLogError, TooManyRetriesError, ) +from fastapi_cloud_cli.commands.deploy.cloud import CreateDeploymentResponse # (bullet emoji, message) — the emoji replaces the progress animation WAITING_MESSAGES = [ diff --git a/src/fastapi_cloud_cli/commands/deployments.py b/src/fastapi_cloud_cli/commands/deployments.py index 30e76e25..651188cb 100644 --- a/src/fastapi_cloud_cli/commands/deployments.py +++ b/src/fastapi_cloud_cli/commands/deployments.py @@ -9,7 +9,7 @@ from rich.text import Text from rich_toolkit import RichToolkit -from fastapi_cloud_cli.utils.api import ( +from fastapi_cloud_cli.api import ( APIClient, BuildLogLineMessage, DeploymentStatus, diff --git a/src/fastapi_cloud_cli/commands/env/_shared.py b/src/fastapi_cloud_cli/commands/env/_shared.py index 40e46986..54d68744 100644 --- a/src/fastapi_cloud_cli/commands/env/_shared.py +++ b/src/fastapi_cloud_cli/commands/env/_shared.py @@ -1,7 +1,7 @@ from pydantic import BaseModel from rich.text import Text -from fastapi_cloud_cli.utils.api import APIClient +from fastapi_cloud_cli.api import APIClient ENV_VAR_VALUE_MAX_LENGTH = 40 diff --git a/src/fastapi_cloud_cli/commands/env/delete.py b/src/fastapi_cloud_cli/commands/env/delete.py index ce357b83..122bebf1 100644 --- a/src/fastapi_cloud_cli/commands/env/delete.py +++ b/src/fastapi_cloud_cli/commands/env/delete.py @@ -6,8 +6,8 @@ from rich_toolkit import RichToolkit from rich_toolkit.menu import Option +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands.env._shared import _get_environment_variables -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.apps import resolve_app_id_or_fail from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import get_rich_toolkit diff --git a/src/fastapi_cloud_cli/commands/env/get.py b/src/fastapi_cloud_cli/commands/env/get.py index 8a789448..5f8682be 100644 --- a/src/fastapi_cloud_cli/commands/env/get.py +++ b/src/fastapi_cloud_cli/commands/env/get.py @@ -7,13 +7,13 @@ from rich_toolkit import RichToolkit from rich_toolkit.menu import Option +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands.env._shared import ( EnvironmentVariable, _find_environment_variable, _format_env_var_value, _get_environment_variables, ) -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.apps import resolve_app_id_or_fail from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import get_rich_toolkit diff --git a/src/fastapi_cloud_cli/commands/env/list.py b/src/fastapi_cloud_cli/commands/env/list.py index 6c769816..e63c9476 100644 --- a/src/fastapi_cloud_cli/commands/env/list.py +++ b/src/fastapi_cloud_cli/commands/env/list.py @@ -7,13 +7,13 @@ from rich.text import Text from rich_toolkit import RichToolkit +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands.env._shared import ( ENV_VAR_VALUE_MAX_LENGTH, EnvironmentVariable, _format_env_var_value, _get_environment_variables, ) -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.apps import resolve_app_id_or_fail from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import get_rich_toolkit diff --git a/src/fastapi_cloud_cli/commands/env/set.py b/src/fastapi_cloud_cli/commands/env/set.py index eb99b68a..90fa1a2c 100644 --- a/src/fastapi_cloud_cli/commands/env/set.py +++ b/src/fastapi_cloud_cli/commands/env/set.py @@ -6,7 +6,7 @@ from pydantic import BaseModel, Field from rich_toolkit import RichToolkit -from fastapi_cloud_cli.utils.api import APIClient +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.utils.apps import resolve_app_id_or_fail from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import FastAPIRichToolkit, get_rich_toolkit diff --git a/src/fastapi_cloud_cli/commands/integrations/providers/list.py b/src/fastapi_cloud_cli/commands/integrations/providers/list.py index 02edb076..2014d0db 100644 --- a/src/fastapi_cloud_cli/commands/integrations/providers/list.py +++ b/src/fastapi_cloud_cli/commands/integrations/providers/list.py @@ -6,7 +6,7 @@ from rich.text import Text from rich_toolkit import RichToolkit -from fastapi_cloud_cli.utils.api import APIClient +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import get_rich_toolkit from fastapi_cloud_cli.utils.execution import JsonOutputOption diff --git a/src/fastapi_cloud_cli/commands/integrations/resources/connect.py b/src/fastapi_cloud_cli/commands/integrations/resources/connect.py index 98963950..fd9f37a8 100644 --- a/src/fastapi_cloud_cli/commands/integrations/resources/connect.py +++ b/src/fastapi_cloud_cli/commands/integrations/resources/connect.py @@ -6,6 +6,7 @@ from rich.text import Text from rich_toolkit import RichToolkit +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands.apps.list import ( App, _get_app, @@ -13,7 +14,6 @@ _get_team, ) from fastapi_cloud_cli.config import Settings -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.apps import resolve_app_id_or_fail from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import get_rich_toolkit diff --git a/src/fastapi_cloud_cli/commands/integrations/resources/disconnect.py b/src/fastapi_cloud_cli/commands/integrations/resources/disconnect.py index 77b12c27..8c3e5567 100644 --- a/src/fastapi_cloud_cli/commands/integrations/resources/disconnect.py +++ b/src/fastapi_cloud_cli/commands/integrations/resources/disconnect.py @@ -5,10 +5,10 @@ from rich_toolkit import RichToolkit from rich_toolkit.menu import Option +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands.integrations.resources.get import _get_resource from fastapi_cloud_cli.commands.integrations.resources.list import _get_resources from fastapi_cloud_cli.commands.integrations.resources.providers import PROVIDER_NAMES -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.apps import resolve_app_id_or_fail from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import get_rich_toolkit diff --git a/src/fastapi_cloud_cli/commands/integrations/resources/get.py b/src/fastapi_cloud_cli/commands/integrations/resources/get.py index 13a69d44..431de30a 100644 --- a/src/fastapi_cloud_cli/commands/integrations/resources/get.py +++ b/src/fastapi_cloud_cli/commands/integrations/resources/get.py @@ -6,11 +6,11 @@ from rich.text import Text from rich_toolkit import RichToolkit +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands.integrations.resources.providers import ( PROVIDER_NAMES, Provider, ) -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.apps import resolve_app_id_or_fail from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import get_details_table, get_rich_toolkit diff --git a/src/fastapi_cloud_cli/commands/integrations/resources/list.py b/src/fastapi_cloud_cli/commands/integrations/resources/list.py index ecae0870..9c2f7ccc 100644 --- a/src/fastapi_cloud_cli/commands/integrations/resources/list.py +++ b/src/fastapi_cloud_cli/commands/integrations/resources/list.py @@ -6,11 +6,11 @@ from rich.text import Text from rich_toolkit import RichToolkit +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands.integrations.resources.providers import ( PROVIDER_NAMES, Provider, ) -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.apps import resolve_app_id_or_fail from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import get_rich_toolkit diff --git a/src/fastapi_cloud_cli/commands/login.py b/src/fastapi_cloud_cli/commands/login.py index b4eac7ba..3cbdf96a 100644 --- a/src/fastapi_cloud_cli/commands/login.py +++ b/src/fastapi_cloud_cli/commands/login.py @@ -3,6 +3,7 @@ import typer +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands._flow import ( DEFAULT_LOGIN_TIMEOUT_SECONDS, complete_device_login, @@ -10,7 +11,6 @@ render_login_output, start_device_authorization, ) -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import FastAPIRichToolkit, get_rich_toolkit from fastapi_cloud_cli.utils.execution import JsonOutputOption diff --git a/src/fastapi_cloud_cli/commands/logs.py b/src/fastapi_cloud_cli/commands/logs.py index 645d2153..84f925ad 100644 --- a/src/fastapi_cloud_cli/commands/logs.py +++ b/src/fastapi_cloud_cli/commands/logs.py @@ -11,7 +11,7 @@ from rich.markup import escape from rich_toolkit import RichToolkit -from fastapi_cloud_cli.utils.api import ( +from fastapi_cloud_cli.api import ( APIClient, AppLogEntry, StreamLogError, diff --git a/src/fastapi_cloud_cli/commands/setup_ci.py b/src/fastapi_cloud_cli/commands/setup_ci.py index 6f5fe6ba..b5d4268b 100644 --- a/src/fastapi_cloud_cli/commands/setup_ci.py +++ b/src/fastapi_cloud_cli/commands/setup_ci.py @@ -9,7 +9,7 @@ import typer from pydantic import BaseModel -from fastapi_cloud_cli.utils.api import APIClient +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.utils.apps import resolve_app_id_or_fail from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import FastAPIRichToolkit, get_rich_toolkit diff --git a/src/fastapi_cloud_cli/commands/teams/__init__.py b/src/fastapi_cloud_cli/commands/teams/__init__.py index 4bce07ca..da4cf7b4 100644 --- a/src/fastapi_cloud_cli/commands/teams/__init__.py +++ b/src/fastapi_cloud_cli/commands/teams/__init__.py @@ -7,13 +7,13 @@ from rich.table import Table from rich_toolkit import RichToolkit +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands.teams.get import ( Team, _get_team_dashboard_url, get_team, ) from fastapi_cloud_cli.config import Settings -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import get_rich_toolkit from fastapi_cloud_cli.utils.execution import JsonOutputOption diff --git a/src/fastapi_cloud_cli/commands/teams/get.py b/src/fastapi_cloud_cli/commands/teams/get.py index 5a6c1531..71a88984 100644 --- a/src/fastapi_cloud_cli/commands/teams/get.py +++ b/src/fastapi_cloud_cli/commands/teams/get.py @@ -5,8 +5,8 @@ from pydantic import BaseModel from rich_toolkit import RichToolkit +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.config import Settings -from fastapi_cloud_cli.utils.api import APIClient from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import get_details_table, get_rich_toolkit from fastapi_cloud_cli.utils.execution import JsonOutputOption diff --git a/src/fastapi_cloud_cli/commands/tokens/create.py b/src/fastapi_cloud_cli/commands/tokens/create.py index 16bfadcd..19cf7639 100644 --- a/src/fastapi_cloud_cli/commands/tokens/create.py +++ b/src/fastapi_cloud_cli/commands/tokens/create.py @@ -5,7 +5,7 @@ from pydantic import BaseModel, Field from rich_toolkit import RichToolkit -from fastapi_cloud_cli.utils.api import APIClient +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.utils.apps import resolve_app_id_or_fail from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import FastAPIRichToolkit, get_rich_toolkit diff --git a/src/fastapi_cloud_cli/commands/tokens/delete.py b/src/fastapi_cloud_cli/commands/tokens/delete.py index f20a7129..66464a06 100644 --- a/src/fastapi_cloud_cli/commands/tokens/delete.py +++ b/src/fastapi_cloud_cli/commands/tokens/delete.py @@ -4,7 +4,7 @@ from pydantic import BaseModel from rich_toolkit import RichToolkit -from fastapi_cloud_cli.utils.api import APIClient +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.utils.apps import resolve_app_id_or_fail from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import get_rich_toolkit diff --git a/src/fastapi_cloud_cli/commands/tokens/list.py b/src/fastapi_cloud_cli/commands/tokens/list.py index a6bc3911..3916befc 100644 --- a/src/fastapi_cloud_cli/commands/tokens/list.py +++ b/src/fastapi_cloud_cli/commands/tokens/list.py @@ -6,7 +6,7 @@ from rich.text import Text from rich_toolkit import RichToolkit -from fastapi_cloud_cli.utils.api import APIClient +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.utils.apps import resolve_app_id_or_fail from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import get_rich_toolkit diff --git a/src/fastapi_cloud_cli/commands/whoami.py b/src/fastapi_cloud_cli/commands/whoami.py index d2941209..669f6480 100644 --- a/src/fastapi_cloud_cli/commands/whoami.py +++ b/src/fastapi_cloud_cli/commands/whoami.py @@ -4,7 +4,7 @@ from pydantic import BaseModel from rich_toolkit import RichToolkit -from fastapi_cloud_cli.utils.api import APIClient +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.utils.auth import Identity from fastapi_cloud_cli.utils.cli import get_rich_toolkit from fastapi_cloud_cli.utils.execution import JsonOutputOption diff --git a/src/fastapi_cloud_cli/utils/teams.py b/src/fastapi_cloud_cli/utils/teams.py index 6be5e19a..249a5cd6 100644 --- a/src/fastapi_cloud_cli/utils/teams.py +++ b/src/fastapi_cloud_cli/utils/teams.py @@ -3,7 +3,7 @@ from pydantic import BaseModel from rich_toolkit.menu import Option -from fastapi_cloud_cli.utils.api import APIClient +from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.utils.apps import get_app_config from fastapi_cloud_cli.utils.cli import FastAPIRichToolkit diff --git a/tests/test_api_client.py b/tests/test_api_client.py index fa8a8271..aea323b3 100644 --- a/tests/test_api_client.py +++ b/tests/test_api_client.py @@ -8,7 +8,7 @@ from httpx import Response from fastapi_cloud_cli import __version__ -from fastapi_cloud_cli.utils.api import ( +from fastapi_cloud_cli.api import ( STREAM_LOGS_MAX_RETRIES, APIClient, BuildLogLineMessage, @@ -37,7 +37,7 @@ def test_api_client_reports_high_confidence_agent() -> None: with ( patch( - "fastapi_cloud_cli.utils.api.detect_agent", return_value=detection + "fastapi_cloud_cli.api.client.detect_agent", return_value=detection ) as mock_detect_agent, APIClient() as client, ): @@ -50,7 +50,7 @@ def test_api_client_reports_high_confidence_agent() -> None: def test_api_client_omits_unattributed_agent() -> None: with ( - patch("fastapi_cloud_cli.utils.api.detect_agent", return_value=None), + patch("fastapi_cloud_cli.api.client.detect_agent", return_value=None), APIClient() as client, ): assert client.headers["User-Agent"] == f"fastapi-cloud-cli/{__version__}" @@ -451,7 +451,7 @@ def test_poll_deployment_status_raises_after_max_consecutive_errors( def test_poll_deployment_status_timeout(client: APIClient, deployment_id: str) -> None: with ( - patch("fastapi_cloud_cli.utils.api.POLL_TIMEOUT", timedelta(seconds=-1)), + patch("fastapi_cloud_cli.api.client.POLL_TIMEOUT", timedelta(seconds=-1)), pytest.raises(TimeoutError, match="timed out"), ): client.poll_deployment_status(deployment_id) diff --git a/tests/test_cli_deploy.py b/tests/test_cli_deploy.py index 72be2349..4fc9485c 100644 --- a/tests/test_cli_deploy.py +++ b/tests/test_cli_deploy.py @@ -15,10 +15,10 @@ from rich_toolkit.progress import Progress from typer.testing import CliRunner, Result +from fastapi_cloud_cli.api import StreamLogError, TooManyRetriesError from fastapi_cloud_cli.cli import app from fastapi_cloud_cli.commands.deploy import wait from fastapi_cloud_cli.config import Settings -from fastapi_cloud_cli.utils.api import StreamLogError, TooManyRetriesError from tests.conftest import ConfiguredApp from tests.utils import Keys, build_logs_response, changing_dir, create_jwt_token @@ -1378,7 +1378,7 @@ def test_shows_error_message_on_build_exception( with ( changing_dir(tmp_path), patch( - "fastapi_cloud_cli.utils.api.APIClient.stream_build_logs", + "fastapi_cloud_cli.api.APIClient.stream_build_logs", side_effect=error, ), ): @@ -2382,7 +2382,7 @@ def test_polling_timeout_shows_dashboard_link( with ( changing_dir(tmp_path), patch( - "fastapi_cloud_cli.utils.api.APIClient.poll_deployment_status", + "fastapi_cloud_cli.api.APIClient.poll_deployment_status", side_effect=TimeoutError("Deployment verification timed out"), ), ): @@ -2431,7 +2431,7 @@ def test_ctrl_c_during_verification_shows_cancelled( with ( changing_dir(tmp_path), patch( - "fastapi_cloud_cli.utils.api.APIClient.poll_deployment_status", + "fastapi_cloud_cli.api.APIClient.poll_deployment_status", side_effect=KeyboardInterrupt(), ), ): @@ -2476,7 +2476,7 @@ def test_ctrl_c_during_build_streaming_shows_cancelled( with ( changing_dir(tmp_path), patch( - "fastapi_cloud_cli.utils.api.APIClient.stream_build_logs", + "fastapi_cloud_cli.api.APIClient.stream_build_logs", side_effect=KeyboardInterrupt(), ), ): diff --git a/tests/test_cli_deployments.py b/tests/test_cli_deployments.py index 82deaf5f..2690a773 100644 --- a/tests/test_cli_deployments.py +++ b/tests/test_cli_deployments.py @@ -9,8 +9,8 @@ from httpx import Response from typer.testing import CliRunner +from fastapi_cloud_cli.api import StreamLogError, TooManyRetriesError from fastapi_cloud_cli.cli import cloud_app as app -from fastapi_cloud_cli.utils.api import StreamLogError, TooManyRetriesError from tests.conftest import ConfiguredApp from tests.utils import build_logs_response, changing_dir @@ -637,7 +637,7 @@ def test_streaming_build_logs_handles_keyboard_interrupt( deployment_id = "00000000-0000-4000-8000-000000000003" with patch( - "fastapi_cloud_cli.utils.api.APIClient.stream_build_logs", + "fastapi_cloud_cli.api.APIClient.stream_build_logs", side_effect=KeyboardInterrupt, ): result = runner.invoke( @@ -652,7 +652,7 @@ def test_build_logs_handles_not_found_stream_error(logged_in_cli: None) -> None: deployment_id = "00000000-0000-4000-8000-000000000003" with patch( - "fastapi_cloud_cli.utils.api.APIClient.stream_build_logs", + "fastapi_cloud_cli.api.APIClient.stream_build_logs", side_effect=StreamLogError("not found", status_code=404), ): result = runner.invoke( @@ -680,7 +680,7 @@ def raise_stream_error(*args: object, **kwargs: object) -> None: raise StreamLogError("HTTP 401") from exc with patch( - "fastapi_cloud_cli.utils.api.APIClient.stream_build_logs", + "fastapi_cloud_cli.api.APIClient.stream_build_logs", side_effect=raise_stream_error, ): result = runner.invoke( @@ -697,7 +697,7 @@ def test_build_logs_handles_generic_stream_error(logged_in_cli: None) -> None: deployment_id = "00000000-0000-4000-8000-000000000003" with patch( - "fastapi_cloud_cli.utils.api.APIClient.stream_build_logs", + "fastapi_cloud_cli.api.APIClient.stream_build_logs", side_effect=StreamLogError("Log storage unavailable"), ): result = runner.invoke( @@ -713,7 +713,7 @@ def test_build_logs_handles_connection_loss(logged_in_cli: None) -> None: deployment_id = "00000000-0000-4000-8000-000000000003" with patch( - "fastapi_cloud_cli.utils.api.APIClient.stream_build_logs", + "fastapi_cloud_cli.api.APIClient.stream_build_logs", side_effect=TooManyRetriesError("Connection lost"), ): result = runner.invoke( diff --git a/tests/test_cli_login.py b/tests/test_cli_login.py index 490c6944..079e4045 100644 --- a/tests/test_cli_login.py +++ b/tests/test_cli_login.py @@ -402,11 +402,11 @@ def test_auth_wait_json_cancel_returns_error_envelope( def test_fetch_access_token_uses_default_timeout( respx_mock: respx.MockRouter, settings: Settings ) -> None: + from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands._flow import ( LoginTimeoutError, fetch_access_token, ) - from fastapi_cloud_cli.utils.api import APIClient respx_mock.post( "/login/device/token", @@ -487,8 +487,8 @@ def test_full_login_with_deploy_token_set( def test_fetch_access_token_success_immediately( respx_mock: respx.MockRouter, settings: Settings ) -> None: + from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands._flow import fetch_access_token - from fastapi_cloud_cli.utils.api import APIClient respx_mock.post( "/login/device/token", @@ -510,8 +510,8 @@ def test_fetch_access_token_authorization_pending_then_success( respx_mock: respx.MockRouter, settings: Settings, ) -> None: + from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands._flow import fetch_access_token - from fastapi_cloud_cli.utils.api import APIClient # First call returns authorization pending, second call succeeds respx_mock.post( @@ -541,8 +541,8 @@ def test_fetch_access_token_handles_400_error_not_authorization_pending( respx_mock: respx.MockRouter, settings: Settings, ) -> None: + from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands._flow import fetch_access_token - from fastapi_cloud_cli.utils.api import APIClient respx_mock.post( "/login/device/token", @@ -562,8 +562,8 @@ def test_fetch_access_token_handles_400_error_not_authorization_pending( def test_fetch_access_token_handles_500_error( respx_mock: respx.MockRouter, settings: Settings ) -> None: + from fastapi_cloud_cli.api import APIClient from fastapi_cloud_cli.commands._flow import fetch_access_token - from fastapi_cloud_cli.utils.api import APIClient respx_mock.post( "/login/device/token", diff --git a/tests/test_deploy_utils.py b/tests/test_deploy_utils.py index 743891cc..b51c6f68 100644 --- a/tests/test_deploy_utils.py +++ b/tests/test_deploy_utils.py @@ -2,12 +2,12 @@ import pytest +from fastapi_cloud_cli.api import DeploymentStatus from fastapi_cloud_cli.commands.deploy.archive import ( _get_large_files, _should_exclude_entry, validate_app_directory, ) -from fastapi_cloud_cli.utils.api import DeploymentStatus def _create_file(path: Path, size_bytes: int) -> None: diff --git a/tests/test_logs.py b/tests/test_logs.py index 0a3dfded..359e9809 100644 --- a/tests/test_logs.py +++ b/tests/test_logs.py @@ -7,8 +7,8 @@ import respx from typer.testing import CliRunner +from fastapi_cloud_cli.api import TooManyRetriesError from fastapi_cloud_cli.cli import cloud_app as app -from fastapi_cloud_cli.utils.api import TooManyRetriesError from tests.conftest import ConfiguredApp from tests.utils import changing_dir @@ -505,7 +505,7 @@ def test_handles_connection_loss( with ( changing_dir(configured_app.path), patch( - "fastapi_cloud_cli.utils.api.APIClient.stream_app_logs", + "fastapi_cloud_cli.api.APIClient.stream_app_logs", side_effect=error("Connection lost"), ), ):