fastapi-cloud-cli 0.5.2__tar.gz → 0.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/PKG-INFO +2 -3
  2. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/pyproject.toml +13 -4
  3. fastapi_cloud_cli-0.6.0/src/fastapi_cloud_cli/__init__.py +1 -0
  4. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/commands/deploy.py +2 -3
  5. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/test_archive.py +60 -28
  6. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/test_cli_deploy.py +2 -19
  7. fastapi_cloud_cli-0.5.2/requirements-tests.txt +0 -8
  8. fastapi_cloud_cli-0.5.2/requirements.txt +0 -5
  9. fastapi_cloud_cli-0.5.2/src/fastapi_cloud_cli/__init__.py +0 -1
  10. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/LICENSE +0 -0
  11. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/README.md +0 -0
  12. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/scripts/format.sh +0 -0
  13. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/scripts/lint.sh +0 -0
  14. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/scripts/test-cov-html.sh +0 -0
  15. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/scripts/test.sh +0 -0
  16. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/__main__.py +0 -0
  17. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/cli.py +0 -0
  18. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/commands/__init__.py +0 -0
  19. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/commands/env.py +0 -0
  20. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/commands/login.py +0 -0
  21. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/commands/logout.py +0 -0
  22. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/commands/unlink.py +0 -0
  23. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/commands/whoami.py +0 -0
  24. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/config.py +0 -0
  25. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/logging.py +0 -0
  26. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/py.typed +0 -0
  27. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/utils/__init__.py +0 -0
  28. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/utils/api.py +0 -0
  29. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/utils/apps.py +0 -0
  30. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/utils/auth.py +0 -0
  31. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/utils/cli.py +0 -0
  32. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/utils/config.py +0 -0
  33. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/utils/env.py +0 -0
  34. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/utils/pydantic_compat.py +0 -0
  35. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/src/fastapi_cloud_cli/utils/sentry.py +0 -0
  36. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/__init__.py +0 -0
  37. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/broken_package/mod/__init__.py +0 -0
  38. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/broken_package/mod/app.py +0 -0
  39. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/broken_package/utils.py +0 -0
  40. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/default_files/default_api/api.py +0 -0
  41. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/default_files/default_app/api.py +0 -0
  42. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/default_files/default_app/app.py +0 -0
  43. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/default_files/default_app_dir_api/app/__init__.py +0 -0
  44. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/default_files/default_app_dir_api/app/api.py +0 -0
  45. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/default_files/default_app_dir_app/app/__init__.py +0 -0
  46. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/default_files/default_app_dir_app/app/api.py +0 -0
  47. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/default_files/default_app_dir_app/app/app.py +0 -0
  48. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/default_files/default_app_dir_main/app/__init__.py +0 -0
  49. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/default_files/default_app_dir_main/app/api.py +0 -0
  50. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/default_files/default_app_dir_main/app/app.py +0 -0
  51. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/default_files/default_app_dir_main/app/main.py +0 -0
  52. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/default_files/default_app_dir_non_default/app/__init__.py +0 -0
  53. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/default_files/default_app_dir_non_default/app/nondefault.py +0 -0
  54. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/default_files/default_main/api.py +0 -0
  55. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/default_files/default_main/app.py +0 -0
  56. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/default_files/default_main/main.py +0 -0
  57. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/default_files/non_default/nonstandard.py +0 -0
  58. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/package/__init__.py +0 -0
  59. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/package/core/__init__.py +0 -0
  60. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/package/core/utils.py +0 -0
  61. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/package/mod/__init__.py +0 -0
  62. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/package/mod/api.py +0 -0
  63. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/package/mod/app.py +0 -0
  64. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/package/mod/other.py +0 -0
  65. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/single_file_api.py +0 -0
  66. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/single_file_app.py +0 -0
  67. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/assets/single_file_other.py +0 -0
  68. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/conftest.py +0 -0
  69. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/test_api_client.py +0 -0
  70. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/test_auth.py +0 -0
  71. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/test_cli.py +0 -0
  72. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/test_cli_login.py +0 -0
  73. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/test_cli_logout.py +0 -0
  74. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/test_cli_unlink.py +0 -0
  75. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/test_cli_whoami.py +0 -0
  76. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/test_config.py +0 -0
  77. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/test_deploy_utils.py +0 -0
  78. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/test_env_delete.py +0 -0
  79. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/test_env_list.py +0 -0
  80. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/test_env_set.py +0 -0
  81. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/test_sentry.py +0 -0
  82. {fastapi_cloud_cli-0.5.2 → fastapi_cloud_cli-0.6.0}/tests/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastapi-cloud-cli
3
- Version: 0.5.2
3
+ Version: 0.6.0
4
4
  Summary: Deploy and manage FastAPI Cloud apps from the command line 🚀
5
5
  Author-Email: Patrick Arminio <patrick@fastapilabs.com>
6
6
  License: MIT
@@ -25,7 +25,6 @@ Classifier: Programming Language :: Python :: 3.10
25
25
  Classifier: Programming Language :: Python :: 3.11
26
26
  Classifier: Programming Language :: Python :: 3.12
27
27
  Classifier: Programming Language :: Python :: 3.13
28
- Classifier: License :: OSI Approved :: MIT License
29
28
  Project-URL: Homepage, https://github.com/fastapilabs/fastapi-cloud-cli
30
29
  Project-URL: Documentation, https://fastapi.tiangolo.com/fastapi-cloud-cli/
31
30
  Project-URL: Repository, https://github.com/fastapilabs/fastapi-cloud-cli
@@ -39,7 +38,7 @@ Requires-Dist: httpx>=0.27.0
39
38
  Requires-Dist: rich-toolkit>=0.14.5
40
39
  Requires-Dist: pydantic[email]>=1.6.1
41
40
  Requires-Dist: sentry-sdk>=2.20.0
42
- Requires-Dist: fastar>=0.5.0
41
+ Requires-Dist: fastar>=0.8.0
43
42
  Provides-Extra: standard
44
43
  Requires-Dist: uvicorn[standard]>=0.15.0; extra == "standard"
45
44
  Description-Content-Type: text/markdown
@@ -29,7 +29,6 @@ classifiers = [
29
29
  "Programming Language :: Python :: 3.11",
30
30
  "Programming Language :: Python :: 3.12",
31
31
  "Programming Language :: Python :: 3.13",
32
- "License :: OSI Approved :: MIT License",
33
32
  ]
34
33
  dependencies = [
35
34
  "typer >= 0.12.3",
@@ -39,9 +38,9 @@ dependencies = [
39
38
  "rich-toolkit >= 0.14.5",
40
39
  "pydantic[email] >= 1.6.1",
41
40
  "sentry-sdk >= 2.20.0",
42
- "fastar >= 0.5.0",
41
+ "fastar >= 0.8.0",
43
42
  ]
44
- version = "0.5.2"
43
+ version = "0.6.0"
45
44
 
46
45
  [project.license]
47
46
  text = "MIT"
@@ -58,6 +57,17 @@ Repository = "https://github.com/fastapilabs/fastapi-cloud-cli"
58
57
  Issues = "https://github.com/fastapilabs/fastapi-cloud-cli/issues"
59
58
  Changelog = "https://github.com/fastapilabs/fastapi-cloud-cli/blob/main/release-notes.md"
60
59
 
60
+ [dependency-groups]
61
+ dev = [
62
+ "pre-commit>=2.17.0,<5.0.0",
63
+ "pytest>=4.4.0,<9.0.0",
64
+ "coverage[toml]>=6.2,<8.0",
65
+ "mypy==1.14.1",
66
+ "ruff==0.13.0",
67
+ "respx==0.22.0",
68
+ "time-machine==2.15.0",
69
+ ]
70
+
61
71
  [build-system]
62
72
  requires = [
63
73
  "pdm-backend",
@@ -74,7 +84,6 @@ path = "src/fastapi_cloud_cli/__init__.py"
74
84
  [tool.pdm.build]
75
85
  source-includes = [
76
86
  "tests/",
77
- "requirements*.txt",
78
87
  "scripts/",
79
88
  ]
80
89
 
@@ -0,0 +1 @@
1
+ __version__ = "0.6.0"
@@ -68,7 +68,7 @@ def archive(path: Path, tar_path: Path) -> Path:
68
68
  logger.debug("Archive will be created at: %s", tar_path)
69
69
 
70
70
  file_count = 0
71
- with fastar.open(tar_path, "w") as tar:
71
+ with fastar.open(tar_path, "w:zst") as tar:
72
72
  for filename in files:
73
73
  if filename.is_dir():
74
74
  continue
@@ -260,8 +260,7 @@ LONG_WAIT_MESSAGES = [
260
260
 
261
261
 
262
262
  def _configure_app(toolkit: RichToolkit, path_to_deploy: Path) -> AppConfig:
263
- if not toolkit.confirm(f"Setup and deploy [blue]{path_to_deploy}[/]?", tag="dir"):
264
- raise typer.Exit(0)
263
+ toolkit.print(f"Setting up and deploying [blue]{path_to_deploy}[/blue]", tag="path")
265
264
 
266
265
  toolkit.print_line()
267
266
 
@@ -1,6 +1,6 @@
1
- import tarfile
2
1
  from pathlib import Path
3
2
 
3
+ import fastar
4
4
  import pytest
5
5
 
6
6
  from fastapi_cloud_cli.commands.deploy import archive
@@ -13,6 +13,13 @@ def src_path(tmp_path: Path) -> Path:
13
13
  return path
14
14
 
15
15
 
16
+ @pytest.fixture
17
+ def dst_path(tmp_path: Path) -> Path:
18
+ path = tmp_path / "destination"
19
+ path.mkdir()
20
+ return path
21
+
22
+
16
23
  @pytest.fixture
17
24
  def tar_path(tmp_path: Path) -> Path:
18
25
  return tmp_path / "archive.tar"
@@ -29,7 +36,7 @@ def test_archive_creates_tar_file(src_path: Path, tar_path: Path) -> None:
29
36
 
30
37
 
31
38
  def test_archive_excludes_venv_and_similar_folders(
32
- src_path: Path, tar_path: Path
39
+ src_path: Path, tar_path: Path, dst_path: Path
33
40
  ) -> None:
34
41
  """Should exclude .venv directory from archive."""
35
42
  # the only files we want to include
@@ -53,24 +60,38 @@ def test_archive_excludes_venv_and_similar_folders(
53
60
 
54
61
  archive(src_path, tar_path)
55
62
 
56
- with tarfile.open(tar_path, "r") as tar:
57
- names = tar.getnames()
58
- assert set(names) == {"main.py", "static/index.html"}
63
+ with fastar.open(tar_path, "r") as tar:
64
+ tar.unpack(dst_path)
65
+
66
+ assert set(dst_path.glob("**/*")) == {
67
+ dst_path / "main.py",
68
+ dst_path / "static",
69
+ dst_path / "static" / "index.html",
70
+ }
59
71
 
60
72
 
61
- def test_archive_preserves_relative_paths(src_path: Path, tar_path: Path) -> None:
73
+ def test_archive_preserves_relative_paths(
74
+ src_path: Path, tar_path: Path, dst_path: Path
75
+ ) -> None:
62
76
  (src_path / "src").mkdir()
63
77
  (src_path / "src" / "app").mkdir()
64
78
  (src_path / "src" / "app" / "main.py").write_text("print('hello')")
65
79
 
66
80
  archive(src_path, tar_path)
67
81
 
68
- with tarfile.open(tar_path, "r") as tar:
69
- names = tar.getnames()
70
- assert names == ["src/app/main.py"]
82
+ with fastar.open(tar_path, "r") as tar:
83
+ tar.unpack(dst_path)
71
84
 
85
+ assert set(dst_path.glob("**/*")) == {
86
+ dst_path / "src",
87
+ dst_path / "src" / "app",
88
+ dst_path / "src" / "app" / "main.py",
89
+ }
72
90
 
73
- def test_archive_respects_fastapicloudignore(src_path: Path, tar_path: Path) -> None:
91
+
92
+ def test_archive_respects_fastapicloudignore(
93
+ src_path: Path, tar_path: Path, dst_path: Path
94
+ ) -> None:
74
95
  """Should exclude files specified in .fastapicloudignore."""
75
96
  (src_path / "main.py").write_text("print('hello')")
76
97
  (src_path / "config.py").write_text("CONFIG = 'value'")
@@ -82,16 +103,17 @@ def test_archive_respects_fastapicloudignore(src_path: Path, tar_path: Path) ->
82
103
 
83
104
  archive(src_path, tar_path)
84
105
 
85
- with tarfile.open(tar_path, "r") as tar:
86
- names = tar.getnames()
87
- assert set(names) == {
88
- "main.py",
89
- "config.py",
90
- }
106
+ with fastar.open(tar_path, "r") as tar:
107
+ tar.unpack(dst_path)
108
+
109
+ assert set(dst_path.glob("**/*")) == {
110
+ dst_path / "main.py",
111
+ dst_path / "config.py",
112
+ }
91
113
 
92
114
 
93
115
  def test_archive_respects_fastapicloudignore_unignore(
94
- src_path: Path, tar_path: Path
116
+ src_path: Path, tar_path: Path, dst_path: Path
95
117
  ) -> None:
96
118
  """Test we can use .fastapicloudignore to unignore files inside .gitignore"""
97
119
  (src_path / "main.py").write_text("print('hello')")
@@ -109,12 +131,20 @@ def test_archive_respects_fastapicloudignore_unignore(
109
131
 
110
132
  archive(src_path, tar_path)
111
133
 
112
- with tarfile.open(tar_path, "r") as tar:
113
- names = tar.getnames()
114
- assert set(names) == {"main.py", "static/build/style.css"}
134
+ with fastar.open(tar_path, "r") as tar:
135
+ tar.unpack(dst_path)
115
136
 
137
+ assert set(dst_path.glob("**/*")) == {
138
+ dst_path / "main.py",
139
+ dst_path / "static",
140
+ dst_path / "static" / "build",
141
+ dst_path / "static" / "build" / "style.css",
142
+ }
116
143
 
117
- def test_archive_includes_hidden_files(src_path: Path, tar_path: Path) -> None:
144
+
145
+ def test_archive_includes_hidden_files(
146
+ src_path: Path, tar_path: Path, dst_path: Path
147
+ ) -> None:
118
148
  """Should include hidden files in the archive by default."""
119
149
  (src_path / "main.py").write_text("print('hello')")
120
150
  (src_path / ".env").write_text("SECRET_KEY=xyz")
@@ -123,10 +153,12 @@ def test_archive_includes_hidden_files(src_path: Path, tar_path: Path) -> None:
123
153
 
124
154
  archive(src_path, tar_path)
125
155
 
126
- with tarfile.open(tar_path, "r") as tar:
127
- names = tar.getnames()
128
- assert set(names) == {
129
- "main.py",
130
- ".env",
131
- ".config/settings.json",
132
- }
156
+ with fastar.open(tar_path, "r") as tar:
157
+ tar.unpack(dst_path)
158
+
159
+ assert set(dst_path.glob("**/*")) == {
160
+ dst_path / "main.py",
161
+ dst_path / ".env",
162
+ dst_path / ".config",
163
+ dst_path / ".config" / "settings.json",
164
+ }
@@ -211,20 +211,6 @@ def test_shows_waitlist_form_when_not_logged_in_longer_flow(
211
211
  assert "Let's go! Thanks for your interest in FastAPI Cloud! 🚀" in result.output
212
212
 
213
213
 
214
- def test_asks_to_setup_the_app(logged_in_cli: None, tmp_path: Path) -> None:
215
- steps = [Keys.RIGHT_ARROW, Keys.ENTER]
216
-
217
- with changing_dir(tmp_path), patch(
218
- "rich_toolkit.container.getchar"
219
- ) as mock_getchar:
220
- mock_getchar.side_effect = steps
221
-
222
- result = runner.invoke(app, ["deploy"])
223
-
224
- assert result.exit_code == 0
225
- assert "Setup and deploy" in result.output
226
-
227
-
228
214
  @pytest.mark.respx(base_url=settings.base_api_url)
229
215
  def test_shows_error_when_trying_to_get_teams(
230
216
  logged_in_cli: None, tmp_path: Path, respx_mock: respx.MockRouter
@@ -323,7 +309,7 @@ def test_asks_for_app_name_after_team(
323
309
  def test_creates_app_on_backend(
324
310
  logged_in_cli: None, tmp_path: Path, respx_mock: respx.MockRouter
325
311
  ) -> None:
326
- steps = [Keys.ENTER, Keys.ENTER, Keys.ENTER, *"demo", Keys.ENTER]
312
+ steps = [Keys.ENTER, Keys.ENTER, *"demo", Keys.ENTER]
327
313
 
328
314
  team = _get_random_team()
329
315
 
@@ -354,7 +340,7 @@ def test_creates_app_on_backend(
354
340
  def test_uses_existing_app(
355
341
  logged_in_cli: None, tmp_path: Path, respx_mock: respx.MockRouter
356
342
  ) -> None:
357
- steps = [Keys.ENTER, Keys.ENTER, Keys.RIGHT_ARROW, Keys.ENTER, *"demo", Keys.ENTER]
343
+ steps = [Keys.ENTER, Keys.RIGHT_ARROW, Keys.ENTER, *"demo", Keys.ENTER]
358
344
 
359
345
  team = _get_random_team()
360
346
 
@@ -384,7 +370,6 @@ def test_exits_successfully_when_deployment_is_done(
384
370
  logged_in_cli: None, tmp_path: Path, respx_mock: respx.MockRouter
385
371
  ) -> None:
386
372
  steps = [
387
- Keys.ENTER,
388
373
  Keys.ENTER,
389
374
  Keys.ENTER,
390
375
  *"demo",
@@ -634,7 +619,6 @@ def test_shows_error_when_app_does_not_exist(
634
619
 
635
620
  def _deploy_without_waiting(respx_mock: respx.MockRouter, tmp_path: Path) -> Result:
636
621
  steps = [
637
- Keys.ENTER,
638
622
  Keys.ENTER,
639
623
  Keys.ENTER,
640
624
  *"demo",
@@ -759,7 +743,6 @@ def test_shows_no_apps_found_message_when_team_has_no_apps(
759
743
  logged_in_cli: None, tmp_path: Path, respx_mock: respx.MockRouter
760
744
  ) -> None:
761
745
  steps = [
762
- Keys.ENTER, # Setup and deploy
763
746
  Keys.ENTER, # Select team
764
747
  Keys.RIGHT_ARROW, # Choose existing app (No)
765
748
  Keys.ENTER,
@@ -1,8 +0,0 @@
1
- -e .
2
-
3
- pytest >=4.4.0,<9.0.0
4
- coverage[toml] >=6.2,<8.0
5
- mypy ==1.14.1
6
- ruff ==0.13.0
7
- respx ==0.22.0
8
- time-machine ==2.15.0
@@ -1,5 +0,0 @@
1
- -e .
2
-
3
- -r requirements-tests.txt
4
-
5
- pre-commit >=2.17.0,<5.0.0
@@ -1 +0,0 @@
1
- __version__ = "0.5.2"