fastapi-cli 0.0.11__tar.gz → 0.0.12__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 (72) hide show
  1. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/PKG-INFO +1 -1
  2. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/pyproject.toml +1 -1
  3. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/requirements-tests.txt +2 -2
  4. fastapi_cli-0.0.12/src/fastapi_cli/__init__.py +1 -0
  5. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/src/fastapi_cli/cli.py +4 -2
  6. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/test_cli.py +126 -0
  7. fastapi_cli-0.0.11/src/fastapi_cli/__init__.py +0 -1
  8. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/LICENSE +0 -0
  9. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/README.md +0 -0
  10. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/pdm_build.py +0 -0
  11. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/requirements-github-actions.txt +0 -0
  12. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/requirements.txt +0 -0
  13. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/scripts/format.sh +0 -0
  14. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/scripts/lint.sh +0 -0
  15. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/scripts/test-cov-html.sh +0 -0
  16. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/scripts/test.sh +0 -0
  17. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/src/fastapi_cli/__main__.py +0 -0
  18. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/src/fastapi_cli/discover.py +0 -0
  19. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/src/fastapi_cli/exceptions.py +0 -0
  20. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/src/fastapi_cli/logging.py +0 -0
  21. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/src/fastapi_cli/py.typed +0 -0
  22. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/src/fastapi_cli/utils/__init__.py +0 -0
  23. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/src/fastapi_cli/utils/cli.py +0 -0
  24. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/__init__.py +0 -0
  25. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/broken_package/mod/__init__.py +0 -0
  26. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/broken_package/mod/app.py +0 -0
  27. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/broken_package/utils.py +0 -0
  28. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/default_files/default_api/api.py +0 -0
  29. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/default_files/default_app/api.py +0 -0
  30. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/default_files/default_app/app.py +0 -0
  31. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/default_files/default_app_dir_api/app/__init__.py +0 -0
  32. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/default_files/default_app_dir_api/app/api.py +0 -0
  33. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/default_files/default_app_dir_app/app/__init__.py +0 -0
  34. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/default_files/default_app_dir_app/app/api.py +0 -0
  35. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/default_files/default_app_dir_app/app/app.py +0 -0
  36. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/default_files/default_app_dir_main/app/__init__.py +0 -0
  37. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/default_files/default_app_dir_main/app/api.py +0 -0
  38. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/default_files/default_app_dir_main/app/app.py +0 -0
  39. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/default_files/default_app_dir_main/app/main.py +0 -0
  40. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/default_files/default_app_dir_non_default/app/__init__.py +0 -0
  41. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/default_files/default_app_dir_non_default/app/nondefault.py +0 -0
  42. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/default_files/default_main/api.py +0 -0
  43. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/default_files/default_main/app.py +0 -0
  44. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/default_files/default_main/main.py +0 -0
  45. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/default_files/non_default/nonstandard.py +0 -0
  46. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/nested_package/__init__.py +0 -0
  47. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/nested_package/package/__init__.py +0 -0
  48. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/nested_package/package/core/__init__.py +0 -0
  49. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/nested_package/package/core/utils.py +0 -0
  50. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/nested_package/package/mod/__init__.py +0 -0
  51. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/nested_package/package/mod/api.py +0 -0
  52. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/nested_package/package/mod/app.py +0 -0
  53. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/nested_package/package/mod/other.py +0 -0
  54. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/package/__init__.py +0 -0
  55. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/package/core/__init__.py +0 -0
  56. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/package/core/utils.py +0 -0
  57. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/package/mod/__init__.py +0 -0
  58. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/package/mod/api.py +0 -0
  59. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/package/mod/app.py +0 -0
  60. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/package/mod/other.py +0 -0
  61. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/single_file_api.py +0 -0
  62. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/single_file_app.py +0 -0
  63. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/assets/single_file_other.py +0 -0
  64. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/conftest.py +0 -0
  65. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/test_discover.py +0 -0
  66. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/test_requirements.py +0 -0
  67. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/test_utils_cli.py +0 -0
  68. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/test_utils_default_dir.py +0 -0
  69. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/test_utils_default_file.py +0 -0
  70. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/test_utils_package.py +0 -0
  71. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/test_utils_single_file.py +0 -0
  72. {fastapi_cli-0.0.11 → fastapi_cli-0.0.12}/tests/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastapi-cli
3
- Version: 0.0.11
3
+ Version: 0.0.12
4
4
  Summary: Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀
5
5
  Author-Email: =?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= <tiangolo@gmail.com>
6
6
  License: MIT
@@ -35,7 +35,7 @@ dependencies = [
35
35
  "uvicorn[standard] >= 0.15.0",
36
36
  "rich-toolkit >= 0.14.8",
37
37
  ]
38
- version = "0.0.11"
38
+ version = "0.0.12"
39
39
 
40
40
  [project.license]
41
41
  text = "MIT"
@@ -2,8 +2,8 @@
2
2
 
3
3
  pytest >=4.4.0,<9.0.0
4
4
  coverage[toml] >=6.2,<8.0
5
- mypy ==1.14.0
6
- ruff ==0.12.12
5
+ mypy ==1.14.1
6
+ ruff ==0.13.0
7
7
  # Needed explicitly by fastapi-cli-slim
8
8
  fastapi-slim
9
9
  uvicorn
@@ -0,0 +1 @@
1
+ __version__ = "0.0.12"
@@ -206,7 +206,8 @@ def dev(
206
206
  port: Annotated[
207
207
  int,
208
208
  typer.Option(
209
- help="The port to serve on. You would normally have a termination proxy on top (another program) handling HTTPS on port [blue]443[/blue] and HTTP on port [blue]80[/blue], transferring the communication to your app."
209
+ help="The port to serve on. You would normally have a termination proxy on top (another program) handling HTTPS on port [blue]443[/blue] and HTTP on port [blue]80[/blue], transferring the communication to your app.",
210
+ envvar="PORT",
210
211
  ),
211
212
  ] = 8000,
212
213
  reload: Annotated[
@@ -305,7 +306,8 @@ def run(
305
306
  port: Annotated[
306
307
  int,
307
308
  typer.Option(
308
- help="The port to serve on. You would normally have a termination proxy on top (another program) handling HTTPS on port [blue]443[/blue] and HTTP on port [blue]80[/blue], transferring the communication to your app."
309
+ help="The port to serve on. You would normally have a termination proxy on top (another program) handling HTTPS on port [blue]443[/blue] and HTTP on port [blue]80[/blue], transferring the communication to your app.",
310
+ envvar="PORT",
309
311
  ),
310
312
  ] = 8000,
311
313
  reload: Annotated[
@@ -122,6 +122,73 @@ def test_dev_args() -> None:
122
122
  )
123
123
 
124
124
 
125
+ def test_dev_env_vars() -> None:
126
+ with changing_dir(assets_path):
127
+ with patch.object(uvicorn, "run") as mock_run:
128
+ result = runner.invoke(
129
+ app, ["dev", "single_file_app.py"], env={"PORT": "8111"}
130
+ )
131
+ assert result.exit_code == 0, result.output
132
+ assert mock_run.called
133
+ assert mock_run.call_args
134
+ assert mock_run.call_args.kwargs == {
135
+ "app": "single_file_app:app",
136
+ "host": "127.0.0.1",
137
+ "port": 8111,
138
+ "reload": True,
139
+ "workers": None,
140
+ "root_path": "",
141
+ "proxy_headers": True,
142
+ "forwarded_allow_ips": None,
143
+ "log_config": get_uvicorn_log_config(),
144
+ }
145
+ assert "Using import string: single_file_app:app" in result.output
146
+ assert "Starting development server 🚀" in result.output
147
+ assert "Server started at http://127.0.0.1:8111" in result.output
148
+ assert "Documentation at http://127.0.0.1:8111/docs" in result.output
149
+ assert (
150
+ "Running in development mode, for production use: fastapi run"
151
+ in result.output
152
+ )
153
+
154
+
155
+ def test_dev_env_vars_and_args() -> None:
156
+ with changing_dir(assets_path):
157
+ with patch.object(uvicorn, "run") as mock_run:
158
+ result = runner.invoke(
159
+ app,
160
+ [
161
+ "dev",
162
+ "single_file_app.py",
163
+ "--port",
164
+ "8080",
165
+ ],
166
+ env={"PORT": "8111"},
167
+ )
168
+ assert result.exit_code == 0, result.output
169
+ assert mock_run.called
170
+ assert mock_run.call_args
171
+ assert mock_run.call_args.kwargs == {
172
+ "app": "single_file_app:app",
173
+ "host": "127.0.0.1",
174
+ "port": 8080,
175
+ "reload": True,
176
+ "workers": None,
177
+ "root_path": "",
178
+ "proxy_headers": True,
179
+ "forwarded_allow_ips": None,
180
+ "log_config": get_uvicorn_log_config(),
181
+ }
182
+ assert "Using import string: single_file_app:app" in result.output
183
+ assert "Starting development server 🚀" in result.output
184
+ assert "Server started at http://127.0.0.1:8080" in result.output
185
+ assert "Documentation at http://127.0.0.1:8080/docs" in result.output
186
+ assert (
187
+ "Running in development mode, for production use: fastapi run"
188
+ in result.output
189
+ )
190
+
191
+
125
192
  def test_run() -> None:
126
193
  with changing_dir(assets_path):
127
194
  with patch.object(uvicorn, "run") as mock_run:
@@ -223,6 +290,65 @@ def test_run_args() -> None:
223
290
  )
224
291
 
225
292
 
293
+ def test_run_env_vars() -> None:
294
+ with changing_dir(assets_path):
295
+ with patch.object(uvicorn, "run") as mock_run:
296
+ result = runner.invoke(
297
+ app, ["run", "single_file_app.py"], env={"PORT": "8111"}
298
+ )
299
+ assert result.exit_code == 0, result.output
300
+ assert mock_run.called
301
+ assert mock_run.call_args
302
+ assert mock_run.call_args.kwargs == {
303
+ "app": "single_file_app:app",
304
+ "host": "0.0.0.0",
305
+ "port": 8111,
306
+ "reload": False,
307
+ "workers": None,
308
+ "root_path": "",
309
+ "proxy_headers": True,
310
+ "forwarded_allow_ips": None,
311
+ "log_config": get_uvicorn_log_config(),
312
+ }
313
+ assert "Using import string: single_file_app:app" in result.output
314
+ assert "Starting production server 🚀" in result.output
315
+ assert "Server started at http://0.0.0.0:8111" in result.output
316
+ assert "Documentation at http://0.0.0.0:8111/docs" in result.output
317
+
318
+
319
+ def test_run_env_vars_and_args() -> None:
320
+ with changing_dir(assets_path):
321
+ with patch.object(uvicorn, "run") as mock_run:
322
+ result = runner.invoke(
323
+ app,
324
+ [
325
+ "run",
326
+ "single_file_app.py",
327
+ "--port",
328
+ "8080",
329
+ ],
330
+ env={"PORT": "8111"},
331
+ )
332
+ assert result.exit_code == 0, result.output
333
+ assert mock_run.called
334
+ assert mock_run.call_args
335
+ assert mock_run.call_args.kwargs == {
336
+ "app": "single_file_app:app",
337
+ "host": "0.0.0.0",
338
+ "port": 8080,
339
+ "reload": False,
340
+ "workers": None,
341
+ "root_path": "",
342
+ "proxy_headers": True,
343
+ "forwarded_allow_ips": None,
344
+ "log_config": get_uvicorn_log_config(),
345
+ }
346
+ assert "Using import string: single_file_app:app" in result.output
347
+ assert "Starting production server 🚀" in result.output
348
+ assert "Server started at http://0.0.0.0:8080" in result.output
349
+ assert "Documentation at http://0.0.0.0:8080/docs" in result.output
350
+
351
+
226
352
  def test_run_error() -> None:
227
353
  with changing_dir(assets_path):
228
354
  result = runner.invoke(app, ["run", "non_existing_file.py"])
@@ -1 +0,0 @@
1
- __version__ = "0.0.11"
File without changes
File without changes
File without changes