fastapi-cli 0.0.8__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.
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/PKG-INFO +1 -1
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/pyproject.toml +1 -4
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/requirements-tests.txt +1 -1
- fastapi_cli-0.0.10/src/fastapi_cli/__init__.py +1 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/src/fastapi_cli/cli.py +16 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/test_cli.py +31 -0
- fastapi_cli-0.0.8/src/fastapi_cli/__init__.py +0 -1
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/LICENSE +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/README.md +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/pdm_build.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/requirements-github-actions.txt +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/requirements.txt +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/scripts/format.sh +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/scripts/lint.sh +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/scripts/test-cov-html.sh +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/scripts/test.sh +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/src/fastapi_cli/__main__.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/src/fastapi_cli/discover.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/src/fastapi_cli/exceptions.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/src/fastapi_cli/logging.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/src/fastapi_cli/py.typed +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/src/fastapi_cli/utils/__init__.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/src/fastapi_cli/utils/cli.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/__init__.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/broken_package/mod/__init__.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/broken_package/mod/app.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/broken_package/utils.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_api/api.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app/api.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app/app.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_api/app/__init__.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_api/app/api.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_app/app/__init__.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_app/app/api.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_app/app/app.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_main/app/__init__.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_main/app/api.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_main/app/app.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_main/app/main.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_non_default/app/__init__.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_non_default/app/nondefault.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_main/api.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_main/app.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_main/main.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/non_default/nonstandard.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/nested_package/__init__.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/nested_package/package/__init__.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/nested_package/package/core/__init__.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/nested_package/package/core/utils.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/nested_package/package/mod/__init__.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/nested_package/package/mod/api.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/nested_package/package/mod/app.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/nested_package/package/mod/other.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/package/__init__.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/package/core/__init__.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/package/core/utils.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/package/mod/__init__.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/package/mod/api.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/package/mod/app.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/package/mod/other.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/single_file_api.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/single_file_app.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/single_file_other.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/conftest.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/test_requirements.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/test_utils_cli.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/test_utils_default_dir.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/test_utils_default_file.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/test_utils_package.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/test_utils_single_file.py +0 -0
- {fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/utils.py +0 -0
|
@@ -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.
|
|
38
|
+
version = "0.0.10"
|
|
39
39
|
|
|
40
40
|
[project.license]
|
|
41
41
|
text = "MIT"
|
|
@@ -56,9 +56,6 @@ Repository = "https://github.com/fastapi/fastapi-cli"
|
|
|
56
56
|
Issues = "https://github.com/fastapi/fastapi-cli/issues"
|
|
57
57
|
Changelog = "https://github.com/fastapi/fastapi-cli/blob/main/release-notes.md"
|
|
58
58
|
|
|
59
|
-
[project.scripts]
|
|
60
|
-
fastapi = "fastapi_cli.cli:main"
|
|
61
|
-
|
|
62
59
|
[build-system]
|
|
63
60
|
requires = [
|
|
64
61
|
"pdm-backend",
|
|
@@ -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.8"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_api/app/api.py
RENAMED
|
File without changes
|
|
File without changes
|
{fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_app/app/api.py
RENAMED
|
File without changes
|
{fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_app/app/app.py
RENAMED
|
File without changes
|
|
File without changes
|
{fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_main/app/api.py
RENAMED
|
File without changes
|
{fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_main/app/app.py
RENAMED
|
File without changes
|
{fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/default_app_dir_main/app/main.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/default_files/non_default/nonstandard.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/nested_package/package/core/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{fastapi_cli-0.0.8 → fastapi_cli-0.0.10}/tests/assets/nested_package/package/mod/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|