fastapi-cli 0.0.9__tar.gz → 0.0.10__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 (71) hide show
  1. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/PKG-INFO +1 -1
  2. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/pyproject.toml +1 -1
  3. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/requirements-tests.txt +1 -1
  4. fastapi_cli-0.0.10/src/fastapi_cli/__init__.py +1 -0
  5. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/src/fastapi_cli/cli.py +16 -0
  6. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/test_cli.py +31 -0
  7. fastapi_cli-0.0.9/src/fastapi_cli/__init__.py +0 -1
  8. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/LICENSE +0 -0
  9. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/README.md +0 -0
  10. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/pdm_build.py +0 -0
  11. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/requirements-github-actions.txt +0 -0
  12. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/requirements.txt +0 -0
  13. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/scripts/format.sh +0 -0
  14. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/scripts/lint.sh +0 -0
  15. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/scripts/test-cov-html.sh +0 -0
  16. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/scripts/test.sh +0 -0
  17. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/src/fastapi_cli/__main__.py +0 -0
  18. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/src/fastapi_cli/discover.py +0 -0
  19. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/src/fastapi_cli/exceptions.py +0 -0
  20. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/src/fastapi_cli/logging.py +0 -0
  21. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/src/fastapi_cli/py.typed +0 -0
  22. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/src/fastapi_cli/utils/__init__.py +0 -0
  23. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/src/fastapi_cli/utils/cli.py +0 -0
  24. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/__init__.py +0 -0
  25. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/broken_package/mod/__init__.py +0 -0
  26. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/broken_package/mod/app.py +0 -0
  27. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/broken_package/utils.py +0 -0
  28. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/default_files/default_api/api.py +0 -0
  29. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app/api.py +0 -0
  30. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app/app.py +0 -0
  31. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_api/app/__init__.py +0 -0
  32. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_api/app/api.py +0 -0
  33. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_app/app/__init__.py +0 -0
  34. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_app/app/api.py +0 -0
  35. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_app/app/app.py +0 -0
  36. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_main/app/__init__.py +0 -0
  37. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_main/app/api.py +0 -0
  38. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_main/app/app.py +0 -0
  39. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_main/app/main.py +0 -0
  40. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_non_default/app/__init__.py +0 -0
  41. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_non_default/app/nondefault.py +0 -0
  42. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/default_files/default_main/api.py +0 -0
  43. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/default_files/default_main/app.py +0 -0
  44. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/default_files/default_main/main.py +0 -0
  45. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/default_files/non_default/nonstandard.py +0 -0
  46. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/nested_package/__init__.py +0 -0
  47. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/nested_package/package/__init__.py +0 -0
  48. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/nested_package/package/core/__init__.py +0 -0
  49. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/nested_package/package/core/utils.py +0 -0
  50. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/nested_package/package/mod/__init__.py +0 -0
  51. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/nested_package/package/mod/api.py +0 -0
  52. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/nested_package/package/mod/app.py +0 -0
  53. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/nested_package/package/mod/other.py +0 -0
  54. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/package/__init__.py +0 -0
  55. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/package/core/__init__.py +0 -0
  56. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/package/core/utils.py +0 -0
  57. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/package/mod/__init__.py +0 -0
  58. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/package/mod/api.py +0 -0
  59. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/package/mod/app.py +0 -0
  60. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/package/mod/other.py +0 -0
  61. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/single_file_api.py +0 -0
  62. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/single_file_app.py +0 -0
  63. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/assets/single_file_other.py +0 -0
  64. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/conftest.py +0 -0
  65. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/test_requirements.py +0 -0
  66. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/test_utils_cli.py +0 -0
  67. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/test_utils_default_dir.py +0 -0
  68. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/test_utils_default_file.py +0 -0
  69. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/test_utils_package.py +0 -0
  70. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/test_utils_single_file.py +0 -0
  71. {fastapi_cli-0.0.9 → fastapi_cli-0.0.10}/tests/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastapi-cli
3
- Version: 0.0.9
3
+ Version: 0.0.10
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.9"
38
+ version = "0.0.10"
39
39
 
40
40
  [project.license]
41
41
  text = "MIT"
@@ -3,7 +3,7 @@
3
3
  pytest >=4.4.0,<9.0.0
4
4
  coverage[toml] >=6.2,<8.0
5
5
  mypy ==1.14.0
6
- ruff ==0.11.2
6
+ ruff ==0.12.11
7
7
  # Needed explicitly by fastapi-cli-slim
8
8
  fastapi-slim
9
9
  uvicorn
@@ -0,0 +1 @@
1
+ __version__ = "0.0.10"
@@ -96,6 +96,7 @@ def _run(
96
96
  command: str,
97
97
  app: Union[str, None] = None,
98
98
  proxy_headers: bool = False,
99
+ forwarded_allow_ips: Union[str, None] = None,
99
100
  ) -> None:
100
101
  with get_rich_toolkit() as toolkit:
101
102
  server_type = "development" if command == "dev" else "production"
@@ -177,6 +178,7 @@ def _run(
177
178
  workers=workers,
178
179
  root_path=root_path,
179
180
  proxy_headers=proxy_headers,
181
+ forwarded_allow_ips=forwarded_allow_ips,
180
182
  log_config=get_uvicorn_log_config(),
181
183
  )
182
184
 
@@ -226,6 +228,12 @@ def dev(
226
228
  help="Enable/Disable X-Forwarded-Proto, X-Forwarded-For, X-Forwarded-Port to populate remote address info."
227
229
  ),
228
230
  ] = True,
231
+ forwarded_allow_ips: Annotated[
232
+ Union[str, None],
233
+ typer.Option(
234
+ help="Comma separated list of IP Addresses to trust with proxy headers. The literal '*' means trust everything."
235
+ ),
236
+ ] = None,
229
237
  ) -> Any:
230
238
  """
231
239
  Run a [bold]FastAPI[/bold] app in [yellow]development[/yellow] mode. 🧪
@@ -261,6 +269,7 @@ def dev(
261
269
  app=app,
262
270
  command="dev",
263
271
  proxy_headers=proxy_headers,
272
+ forwarded_allow_ips=forwarded_allow_ips,
264
273
  )
265
274
 
266
275
 
@@ -315,6 +324,12 @@ def run(
315
324
  help="Enable/Disable X-Forwarded-Proto, X-Forwarded-For, X-Forwarded-Port to populate remote address info."
316
325
  ),
317
326
  ] = True,
327
+ forwarded_allow_ips: Annotated[
328
+ Union[str, None],
329
+ typer.Option(
330
+ help="Comma separated list of IP Addresses to trust with proxy headers. The literal '*' means trust everything."
331
+ ),
332
+ ] = None,
318
333
  ) -> Any:
319
334
  """
320
335
  Run a [bold]FastAPI[/bold] app in [green]production[/green] mode. 🚀
@@ -351,6 +366,7 @@ def run(
351
366
  app=app,
352
367
  command="run",
353
368
  proxy_headers=proxy_headers,
369
+ forwarded_allow_ips=forwarded_allow_ips,
354
370
  )
355
371
 
356
372
 
@@ -30,6 +30,7 @@ def test_dev() -> None:
30
30
  "workers": None,
31
31
  "root_path": "",
32
32
  "proxy_headers": True,
33
+ "forwarded_allow_ips": None,
33
34
  "log_config": get_uvicorn_log_config(),
34
35
  }
35
36
  assert "Using import string: single_file_app:app" in result.output
@@ -59,6 +60,7 @@ def test_dev_package() -> None:
59
60
  "workers": None,
60
61
  "root_path": "",
61
62
  "proxy_headers": True,
63
+ "forwarded_allow_ips": None,
62
64
  "log_config": get_uvicorn_log_config(),
63
65
  }
64
66
  assert "Using import string: nested_package.package:app" in result.output
@@ -107,6 +109,7 @@ def test_dev_args() -> None:
107
109
  "workers": None,
108
110
  "root_path": "/api",
109
111
  "proxy_headers": False,
112
+ "forwarded_allow_ips": None,
110
113
  "log_config": get_uvicorn_log_config(),
111
114
  }
112
115
  assert "Using import string: single_file_app:api" in result.output
@@ -134,6 +137,33 @@ def test_run() -> None:
134
137
  "workers": None,
135
138
  "root_path": "",
136
139
  "proxy_headers": True,
140
+ "forwarded_allow_ips": None,
141
+ "log_config": get_uvicorn_log_config(),
142
+ }
143
+ assert "Using import string: single_file_app:app" in result.output
144
+ assert "Starting production server 🚀" in result.output
145
+ assert "Server started at http://0.0.0.0:8000" in result.output
146
+ assert "Documentation at http://0.0.0.0:8000/docs" in result.output
147
+
148
+
149
+ def test_run_trust_proxy() -> None:
150
+ with changing_dir(assets_path):
151
+ with patch.object(uvicorn, "run") as mock_run:
152
+ result = runner.invoke(
153
+ app, ["run", "single_file_app.py", "--forwarded-allow-ips", "*"]
154
+ )
155
+ assert result.exit_code == 0, result.output
156
+ assert mock_run.called
157
+ assert mock_run.call_args
158
+ assert mock_run.call_args.kwargs == {
159
+ "app": "single_file_app:app",
160
+ "host": "0.0.0.0",
161
+ "port": 8000,
162
+ "reload": False,
163
+ "workers": None,
164
+ "root_path": "",
165
+ "proxy_headers": True,
166
+ "forwarded_allow_ips": "*",
137
167
  "log_config": get_uvicorn_log_config(),
138
168
  }
139
169
  assert "Using import string: single_file_app:app" in result.output
@@ -179,6 +209,7 @@ def test_run_args() -> None:
179
209
  "workers": 2,
180
210
  "root_path": "/api",
181
211
  "proxy_headers": False,
212
+ "forwarded_allow_ips": None,
182
213
  "log_config": get_uvicorn_log_config(),
183
214
  }
184
215
 
@@ -1 +0,0 @@
1
- __version__ = "0.0.9"
File without changes
File without changes
File without changes
File without changes