fastapi-cli 0.0.19__tar.gz → 0.0.21__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 (78) hide show
  1. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/PKG-INFO +1 -1
  2. fastapi_cli-0.0.21/pdm_build.py +40 -0
  3. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/pyproject.toml +36 -2
  4. fastapi_cli-0.0.21/src/fastapi_cli/__init__.py +1 -0
  5. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/src/fastapi_cli/cli.py +13 -0
  6. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/test_cli.py +37 -0
  7. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/test_utils_cli.py +2 -1
  8. fastapi_cli-0.0.19/pdm_build.py +0 -20
  9. fastapi_cli-0.0.19/requirements-github-actions.txt +0 -1
  10. fastapi_cli-0.0.19/requirements-tests.txt +0 -9
  11. fastapi_cli-0.0.19/requirements.txt +0 -5
  12. fastapi_cli-0.0.19/src/fastapi_cli/__init__.py +0 -1
  13. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/LICENSE +0 -0
  14. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/README.md +0 -0
  15. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/scripts/format.sh +0 -0
  16. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/scripts/lint.sh +0 -0
  17. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/scripts/test-cov-html.sh +0 -0
  18. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/scripts/test.sh +0 -0
  19. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/src/fastapi_cli/__main__.py +0 -0
  20. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/src/fastapi_cli/config.py +0 -0
  21. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/src/fastapi_cli/discover.py +0 -0
  22. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/src/fastapi_cli/exceptions.py +0 -0
  23. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/src/fastapi_cli/logging.py +0 -0
  24. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/src/fastapi_cli/py.typed +0 -0
  25. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/src/fastapi_cli/utils/__init__.py +0 -0
  26. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/src/fastapi_cli/utils/cli.py +0 -0
  27. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/__init__.py +0 -0
  28. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/broken_package/mod/__init__.py +0 -0
  29. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/broken_package/mod/app.py +0 -0
  30. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/broken_package/utils.py +0 -0
  31. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/default_files/default_api/api.py +0 -0
  32. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/default_files/default_app/api.py +0 -0
  33. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/default_files/default_app/app.py +0 -0
  34. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/default_files/default_app_dir_api/app/__init__.py +0 -0
  35. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/default_files/default_app_dir_api/app/api.py +0 -0
  36. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/default_files/default_app_dir_app/app/__init__.py +0 -0
  37. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/default_files/default_app_dir_app/app/api.py +0 -0
  38. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/default_files/default_app_dir_app/app/app.py +0 -0
  39. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/default_files/default_app_dir_main/app/__init__.py +0 -0
  40. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/default_files/default_app_dir_main/app/api.py +0 -0
  41. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/default_files/default_app_dir_main/app/app.py +0 -0
  42. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/default_files/default_app_dir_main/app/main.py +0 -0
  43. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/default_files/default_app_dir_non_default/app/__init__.py +0 -0
  44. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/default_files/default_app_dir_non_default/app/nondefault.py +0 -0
  45. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/default_files/default_main/api.py +0 -0
  46. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/default_files/default_main/app.py +0 -0
  47. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/default_files/default_main/main.py +0 -0
  48. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/default_files/non_default/nonstandard.py +0 -0
  49. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/nested_package/__init__.py +0 -0
  50. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/nested_package/package/__init__.py +0 -0
  51. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/nested_package/package/core/__init__.py +0 -0
  52. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/nested_package/package/core/utils.py +0 -0
  53. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/nested_package/package/mod/__init__.py +0 -0
  54. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/nested_package/package/mod/api.py +0 -0
  55. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/nested_package/package/mod/app.py +0 -0
  56. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/nested_package/package/mod/other.py +0 -0
  57. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/package/__init__.py +0 -0
  58. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/package/core/__init__.py +0 -0
  59. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/package/core/utils.py +0 -0
  60. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/package/mod/__init__.py +0 -0
  61. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/package/mod/api.py +0 -0
  62. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/package/mod/app.py +0 -0
  63. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/package/mod/other.py +0 -0
  64. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/pyproject_config/another_module.py +0 -0
  65. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/pyproject_config/my_module.py +0 -0
  66. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/pyproject_config/pyproject.toml +0 -0
  67. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/single_file_api.py +0 -0
  68. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/single_file_app.py +0 -0
  69. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/assets/single_file_other.py +0 -0
  70. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/conftest.py +0 -0
  71. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/test_cli_pyproject.py +0 -0
  72. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/test_discover.py +0 -0
  73. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/test_requirements.py +0 -0
  74. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/test_utils_default_dir.py +0 -0
  75. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/test_utils_default_file.py +0 -0
  76. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/test_utils_package.py +0 -0
  77. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/test_utils_single_file.py +0 -0
  78. {fastapi_cli-0.0.19 → fastapi_cli-0.0.21}/tests/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-cli
3
- Version: 0.0.19
3
+ Version: 0.0.21
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-Expression: MIT
@@ -0,0 +1,40 @@
1
+ import os
2
+ from typing import Any
3
+
4
+ from pdm.backend.hooks import Context
5
+
6
+ TIANGOLO_BUILD_PACKAGE = os.getenv("TIANGOLO_BUILD_PACKAGE")
7
+
8
+
9
+ def pdm_build_initialize(context: Context) -> None:
10
+ metadata = context.config.metadata
11
+ # Get main version
12
+ version = metadata["version"]
13
+ # Get custom config for the current package, from the env var
14
+ all_configs_config: dict[str, Any] = context.config.data["tool"]["tiangolo"][
15
+ "_internal-slim-build"
16
+ ]["packages"]
17
+
18
+ if TIANGOLO_BUILD_PACKAGE not in all_configs_config:
19
+ return
20
+
21
+ config = all_configs_config[TIANGOLO_BUILD_PACKAGE]
22
+ project_config: dict[str, Any] = config["project"]
23
+ # Override main [project] configs with custom configs for this package
24
+ for key, value in project_config.items():
25
+ metadata[key] = value
26
+ # Get custom build config for the current package
27
+ build_config: dict[str, Any] = (
28
+ config.get("tool", {}).get("pdm", {}).get("build", {})
29
+ )
30
+ # Override PDM build config with custom build config for this package
31
+ for key, value in build_config.items():
32
+ context.config.build_config[key] = value
33
+ # Get main dependencies
34
+ dependencies: list[str] = metadata.get("dependencies", [])
35
+ # Sync versions in dependencies
36
+ new_dependencies = []
37
+ for dep in dependencies:
38
+ new_dep = f"{dep}>={version}"
39
+ new_dependencies.append(new_dep)
40
+ metadata["dependencies"] = new_dependencies
@@ -39,7 +39,7 @@ dependencies = [
39
39
  "rich-toolkit >= 0.14.8",
40
40
  "tomli >= 2.0.0; python_version < '3.11'",
41
41
  ]
42
- version = "0.0.19"
42
+ version = "0.0.21"
43
43
 
44
44
  [project.optional-dependencies]
45
45
  standard = [
@@ -60,6 +60,23 @@ Repository = "https://github.com/fastapi/fastapi-cli"
60
60
  Issues = "https://github.com/fastapi/fastapi-cli/issues"
61
61
  Changelog = "https://github.com/fastapi/fastapi-cli/blob/main/release-notes.md"
62
62
 
63
+ [dependency-groups]
64
+ dev = [
65
+ { include-group = "tests" },
66
+ "prek>=0.2.24,<1.0.0",
67
+ ]
68
+ github-actions = [
69
+ "smokeshow>=0.5.0",
70
+ ]
71
+ tests = [
72
+ "coverage[toml]>=6.2,<8.0",
73
+ "fastapi-slim>=0.128.0",
74
+ "mypy==1.19.1",
75
+ "pytest>=4.4.0,<10.0.0",
76
+ "ruff==0.15.0",
77
+ "uvicorn>=0.39.0",
78
+ ]
79
+
63
80
  [build-system]
64
81
  requires = [
65
82
  "pdm-backend",
@@ -76,12 +93,29 @@ path = "src/fastapi_cli/__init__.py"
76
93
  [tool.pdm.build]
77
94
  source-includes = [
78
95
  "tests/",
79
- "requirements*.txt",
80
96
  "scripts/",
81
97
  ]
82
98
 
83
99
  [tool.tiangolo._internal-slim-build.packages.fastapi-cli-slim.project]
84
100
  name = "fastapi-cli-slim"
101
+ readme = "fastapi-cli-slim/README.md"
102
+ dependencies = [
103
+ "fastapi-cli",
104
+ ]
105
+
106
+ [tool.tiangolo._internal-slim-build.packages.fastapi-cli-slim.project.optional-dependencies]
107
+
108
+ [tool.tiangolo._internal-slim-build.packages.fastapi-cli-slim.project.scripts]
109
+
110
+ [tool.tiangolo._internal-slim-build.packages.fastapi-cli-slim.tool.pdm.build]
111
+ excludes = [
112
+ "src",
113
+ "tests",
114
+ "pdm_build.py",
115
+ ]
116
+ source-includes = [
117
+ "",
118
+ ]
85
119
 
86
120
  [tool.pytest.ini_options]
87
121
  addopts = [
@@ -0,0 +1 @@
1
+ __version__ = "0.0.21"
@@ -104,6 +104,7 @@ def _run(
104
104
  host: str = "127.0.0.1",
105
105
  port: int = 8000,
106
106
  reload: bool = True,
107
+ reload_dirs: Union[list[Path], None] = None,
107
108
  workers: Union[int, None] = None,
108
109
  root_path: str = "",
109
110
  command: str,
@@ -219,6 +220,11 @@ def _run(
219
220
  host=host,
220
221
  port=port,
221
222
  reload=reload,
223
+ reload_dirs=(
224
+ [str(directory.resolve()) for directory in reload_dirs]
225
+ if reload_dirs
226
+ else None
227
+ ),
222
228
  workers=workers,
223
229
  root_path=root_path,
224
230
  proxy_headers=proxy_headers,
@@ -255,6 +261,12 @@ def dev(
255
261
  help="Enable auto-reload of the server when (code) files change. This is [bold]resource intensive[/bold], use it only during development."
256
262
  ),
257
263
  ] = True,
264
+ reload_dir: Annotated[
265
+ Union[list[Path], None],
266
+ typer.Option(
267
+ help="Set reload directories explicitly, instead of using the current working directory."
268
+ ),
269
+ ] = None,
258
270
  root_path: Annotated[
259
271
  str,
260
272
  typer.Option(
@@ -318,6 +330,7 @@ def dev(
318
330
  host=host,
319
331
  port=port,
320
332
  reload=reload,
333
+ reload_dirs=reload_dir,
321
334
  root_path=root_path,
322
335
  app=app,
323
336
  entrypoint=entrypoint,
@@ -27,6 +27,7 @@ def test_dev() -> None:
27
27
  "host": "127.0.0.1",
28
28
  "port": 8000,
29
29
  "reload": True,
30
+ "reload_dirs": None,
30
31
  "workers": None,
31
32
  "root_path": "",
32
33
  "proxy_headers": True,
@@ -72,6 +73,7 @@ def test_dev_package() -> None:
72
73
  "host": "127.0.0.1",
73
74
  "port": 8000,
74
75
  "reload": True,
76
+ "reload_dirs": None,
75
77
  "workers": None,
76
78
  "root_path": "",
77
79
  "proxy_headers": True,
@@ -121,6 +123,7 @@ def test_dev_args() -> None:
121
123
  "host": "192.168.0.2",
122
124
  "port": 8080,
123
125
  "reload": False,
126
+ "reload_dirs": None,
124
127
  "workers": None,
125
128
  "root_path": "/api",
126
129
  "proxy_headers": False,
@@ -151,6 +154,7 @@ def test_dev_env_vars() -> None:
151
154
  "host": "127.0.0.1",
152
155
  "port": 8111,
153
156
  "reload": True,
157
+ "reload_dirs": None,
154
158
  "workers": None,
155
159
  "root_path": "",
156
160
  "proxy_headers": True,
@@ -188,6 +192,7 @@ def test_dev_env_vars_and_args() -> None:
188
192
  "host": "127.0.0.1",
189
193
  "port": 8080,
190
194
  "reload": True,
195
+ "reload_dirs": None,
191
196
  "workers": None,
192
197
  "root_path": "",
193
198
  "proxy_headers": True,
@@ -233,6 +238,7 @@ def test_run() -> None:
233
238
  "host": "0.0.0.0",
234
239
  "port": 8000,
235
240
  "reload": False,
241
+ "reload_dirs": None,
236
242
  "workers": None,
237
243
  "root_path": "",
238
244
  "proxy_headers": True,
@@ -259,6 +265,7 @@ def test_run_trust_proxy() -> None:
259
265
  "host": "0.0.0.0",
260
266
  "port": 8000,
261
267
  "reload": False,
268
+ "reload_dirs": None,
262
269
  "workers": None,
263
270
  "root_path": "",
264
271
  "proxy_headers": True,
@@ -305,6 +312,7 @@ def test_run_args() -> None:
305
312
  "host": "192.168.0.2",
306
313
  "port": 8080,
307
314
  "reload": False,
315
+ "reload_dirs": None,
308
316
  "workers": 2,
309
317
  "root_path": "/api",
310
318
  "proxy_headers": False,
@@ -336,6 +344,7 @@ def test_run_env_vars() -> None:
336
344
  "host": "0.0.0.0",
337
345
  "port": 8111,
338
346
  "reload": False,
347
+ "reload_dirs": None,
339
348
  "workers": None,
340
349
  "root_path": "",
341
350
  "proxy_headers": True,
@@ -369,6 +378,7 @@ def test_run_env_vars_and_args() -> None:
369
378
  "host": "0.0.0.0",
370
379
  "port": 8080,
371
380
  "reload": False,
381
+ "reload_dirs": None,
372
382
  "workers": None,
373
383
  "root_path": "",
374
384
  "proxy_headers": True,
@@ -404,6 +414,7 @@ def test_dev_help() -> None:
404
414
  assert "The host to serve on." in result.output
405
415
  assert "The port to serve on." in result.output
406
416
  assert "Enable auto-reload of the server when (code) files change." in result.output
417
+ assert "Set reload directories explicitly" in result.output
407
418
  assert "The root path is used to tell your app" in result.output
408
419
  assert "The name of the variable that contains the FastAPI app" in result.output
409
420
  assert "Use multiple worker processes." not in result.output
@@ -443,6 +454,30 @@ def test_version() -> None:
443
454
  assert "FastAPI CLI version:" in result.output
444
455
 
445
456
 
457
+ def test_dev_reload_dir() -> None:
458
+ with changing_dir(assets_path):
459
+ with patch.object(uvicorn, "run") as mock_run:
460
+ result = runner.invoke(
461
+ app,
462
+ [
463
+ "dev",
464
+ "single_file_app.py",
465
+ "--reload-dir",
466
+ "src",
467
+ "--reload-dir",
468
+ "lib",
469
+ ],
470
+ )
471
+ assert result.exit_code == 0, result.output
472
+ assert mock_run.called
473
+ assert mock_run.call_args
474
+ # Paths are resolved to absolute paths
475
+ reload_dirs = mock_run.call_args.kwargs["reload_dirs"]
476
+ assert len(reload_dirs) == 2
477
+ assert reload_dirs[0] == str((assets_path / "src").resolve())
478
+ assert reload_dirs[1] == str((assets_path / "lib").resolve())
479
+
480
+
446
481
  def test_dev_with_import_string() -> None:
447
482
  with changing_dir(assets_path):
448
483
  with patch.object(uvicorn, "run") as mock_run:
@@ -456,6 +491,7 @@ def test_dev_with_import_string() -> None:
456
491
  "host": "127.0.0.1",
457
492
  "port": 8000,
458
493
  "reload": True,
494
+ "reload_dirs": None,
459
495
  "workers": None,
460
496
  "root_path": "",
461
497
  "proxy_headers": True,
@@ -477,6 +513,7 @@ def test_run_with_import_string() -> None:
477
513
  "host": "0.0.0.0",
478
514
  "port": 8000,
479
515
  "reload": False,
516
+ "reload_dirs": None,
480
517
  "workers": None,
481
518
  "root_path": "",
482
519
  "proxy_headers": True,
@@ -1,4 +1,5 @@
1
1
  import logging
2
+ from logging.config import dictConfig
2
3
 
3
4
  from pytest import LogCaptureFixture
4
5
 
@@ -63,7 +64,7 @@ def test_log_config_does_not_disable_existing_loggers(
63
64
  logger1.setLevel(logging.INFO)
64
65
  logger1.info("Message before configuration")
65
66
 
66
- logging.config.dictConfig(get_uvicorn_log_config())
67
+ dictConfig(get_uvicorn_log_config())
67
68
 
68
69
  logger2 = logging.getLogger(__name__)
69
70
 
@@ -1,20 +0,0 @@
1
- import os
2
- from typing import Any
3
-
4
- from pdm.backend.hooks import Context
5
-
6
- TIANGOLO_BUILD_PACKAGE = os.getenv("TIANGOLO_BUILD_PACKAGE", "fastapi-cli")
7
-
8
-
9
- def pdm_build_initialize(context: Context):
10
- metadata = context.config.metadata
11
- # Get custom config for the current package, from the env var
12
- config: dict[str, Any] = context.config.data["tool"]["tiangolo"][
13
- "_internal-slim-build"
14
- ]["packages"].get(TIANGOLO_BUILD_PACKAGE)
15
- if not config:
16
- return
17
- project_config: dict[str, Any] = config["project"]
18
- # Override main [project] configs with custom configs for this package
19
- for key, value in project_config.items():
20
- metadata[key] = value
@@ -1 +0,0 @@
1
- smokeshow
@@ -1,9 +0,0 @@
1
- -e .[standard]
2
-
3
- pytest >=4.4.0,<9.0.0
4
- coverage[toml] >=6.2,<8.0
5
- mypy ==1.14.1
6
- ruff ==0.14.6
7
- # Needed explicitly by fastapi-cli-slim
8
- fastapi-slim
9
- uvicorn
@@ -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.0.19"
File without changes
File without changes