fastapi-cli 0.0.31__tar.gz → 0.0.32__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 (77) hide show
  1. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/PKG-INFO +5 -1
  2. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/README.md +4 -0
  3. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/pyproject.toml +1 -1
  4. fastapi_cli-0.0.32/src/fastapi_cli/__init__.py +1 -0
  5. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/src/fastapi_cli/cli.py +2 -0
  6. fastapi_cli-0.0.32/tests/assets/environment_app.py +12 -0
  7. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/test_cli.py +48 -1
  8. fastapi_cli-0.0.31/src/fastapi_cli/__init__.py +0 -1
  9. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/LICENSE +0 -0
  10. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/scripts/add_latest_release_date.py +0 -0
  11. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/scripts/format.sh +0 -0
  12. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/scripts/lint.sh +0 -0
  13. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/scripts/prepare_release.py +0 -0
  14. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/scripts/test-cov-html.sh +0 -0
  15. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/scripts/test.sh +0 -0
  16. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/src/fastapi_cli/__main__.py +0 -0
  17. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/src/fastapi_cli/config.py +0 -0
  18. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/src/fastapi_cli/discover.py +0 -0
  19. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/src/fastapi_cli/exceptions.py +0 -0
  20. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/src/fastapi_cli/logging.py +0 -0
  21. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/src/fastapi_cli/py.typed +0 -0
  22. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/src/fastapi_cli/utils/__init__.py +0 -0
  23. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/src/fastapi_cli/utils/cli.py +0 -0
  24. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/__init__.py +0 -0
  25. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/broken_package/mod/__init__.py +0 -0
  26. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/broken_package/mod/app.py +0 -0
  27. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/broken_package/utils.py +0 -0
  28. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/default_files/default_api/api.py +0 -0
  29. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/default_files/default_app/api.py +0 -0
  30. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/default_files/default_app/app.py +0 -0
  31. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/default_files/default_app_dir_api/app/__init__.py +0 -0
  32. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/default_files/default_app_dir_api/app/api.py +0 -0
  33. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/default_files/default_app_dir_app/app/__init__.py +0 -0
  34. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/default_files/default_app_dir_app/app/api.py +0 -0
  35. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/default_files/default_app_dir_app/app/app.py +0 -0
  36. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/default_files/default_app_dir_main/app/__init__.py +0 -0
  37. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/default_files/default_app_dir_main/app/api.py +0 -0
  38. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/default_files/default_app_dir_main/app/app.py +0 -0
  39. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/default_files/default_app_dir_main/app/main.py +0 -0
  40. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/default_files/default_app_dir_non_default/app/__init__.py +0 -0
  41. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/default_files/default_app_dir_non_default/app/nondefault.py +0 -0
  42. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/default_files/default_main/api.py +0 -0
  43. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/default_files/default_main/app.py +0 -0
  44. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/default_files/default_main/main.py +0 -0
  45. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/default_files/non_default/nonstandard.py +0 -0
  46. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/nested_package/__init__.py +0 -0
  47. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/nested_package/package/__init__.py +0 -0
  48. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/nested_package/package/core/__init__.py +0 -0
  49. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/nested_package/package/core/utils.py +0 -0
  50. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/nested_package/package/mod/__init__.py +0 -0
  51. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/nested_package/package/mod/api.py +0 -0
  52. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/nested_package/package/mod/app.py +0 -0
  53. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/nested_package/package/mod/other.py +0 -0
  54. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/package/__init__.py +0 -0
  55. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/package/core/__init__.py +0 -0
  56. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/package/core/utils.py +0 -0
  57. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/package/mod/__init__.py +0 -0
  58. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/package/mod/api.py +0 -0
  59. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/package/mod/app.py +0 -0
  60. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/package/mod/other.py +0 -0
  61. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/pyproject_config/another_module.py +0 -0
  62. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/pyproject_config/my_module.py +0 -0
  63. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/pyproject_config/pyproject.toml +0 -0
  64. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/single_file_api.py +0 -0
  65. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/single_file_app.py +0 -0
  66. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/assets/single_file_other.py +0 -0
  67. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/conftest.py +0 -0
  68. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/test_cli_pyproject.py +0 -0
  69. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/test_discover.py +0 -0
  70. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/test_prepare_release.py +0 -0
  71. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/test_requirements.py +0 -0
  72. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/test_utils_cli.py +0 -0
  73. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/test_utils_default_dir.py +0 -0
  74. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/test_utils_default_file.py +0 -0
  75. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/test_utils_package.py +0 -0
  76. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/test_utils_single_file.py +0 -0
  77. {fastapi_cli-0.0.31 → fastapi_cli-0.0.32}/tests/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-cli
3
- Version: 0.0.31
3
+ Version: 0.0.32
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
@@ -121,6 +121,10 @@ By default, it will have **auto-reload** enabled, so it will automatically reloa
121
121
 
122
122
  By default it will listen on the IP address `127.0.0.1`, which is the IP for your machine to communicate with itself alone (`localhost`).
123
123
 
124
+ Before importing your app, `fastapi dev` sets the `FASTAPI_ENV` environment variable to `development`. If `FASTAPI_ENV` is already set, its existing value is preserved. This lets app startup code choose development-friendly behavior while allowing you to provide an app-specific environment such as `staging`.
125
+
126
+ The conventional `FASTAPI_ENV` values are `development` and `production`. `fastapi run` currently leaves `FASTAPI_ENV` unchanged, so set it explicitly if your app needs to detect production mode.
127
+
124
128
  ## `fastapi run`
125
129
 
126
130
  When you run `fastapi run`, it will run on production mode by default.
@@ -76,6 +76,10 @@ By default, it will have **auto-reload** enabled, so it will automatically reloa
76
76
 
77
77
  By default it will listen on the IP address `127.0.0.1`, which is the IP for your machine to communicate with itself alone (`localhost`).
78
78
 
79
+ Before importing your app, `fastapi dev` sets the `FASTAPI_ENV` environment variable to `development`. If `FASTAPI_ENV` is already set, its existing value is preserved. This lets app startup code choose development-friendly behavior while allowing you to provide an app-specific environment such as `staging`.
80
+
81
+ The conventional `FASTAPI_ENV` values are `development` and `production`. `fastapi run` currently leaves `FASTAPI_ENV` unchanged, so set it explicitly if your app needs to detect production mode.
82
+
79
83
  ## `fastapi run`
80
84
 
81
85
  When you run `fastapi run`, it will run on production mode by default.
@@ -38,7 +38,7 @@ dependencies = [
38
38
  "rich-toolkit >= 0.14.8",
39
39
  "tomli >= 2.0.0; python_version < '3.11'",
40
40
  ]
41
- version = "0.0.31"
41
+ version = "0.0.32"
42
42
 
43
43
  [project.optional-dependencies]
44
44
  standard = [
@@ -0,0 +1 @@
1
+ __version__ = "0.0.32"
@@ -399,6 +399,8 @@ def dev(
399
399
 
400
400
  Otherwise, it uses the first [bold]FastAPI[/bold] app found in the imported module or package.
401
401
  """
402
+ os.environ.setdefault("FASTAPI_ENV", "development")
403
+
402
404
  _run(
403
405
  path=path,
404
406
  host=host,
@@ -0,0 +1,12 @@
1
+ import os
2
+
3
+ from fastapi import FastAPI
4
+
5
+ app = FastAPI()
6
+
7
+ fastapi_env_at_import = os.environ.get("FASTAPI_ENV")
8
+
9
+
10
+ @app.get("/fastapi-env")
11
+ def get_fastapi_env() -> dict[str, str | None]:
12
+ return {"fastapi_env": fastapi_env_at_import}
@@ -6,7 +6,10 @@ from unittest.mock import patch
6
6
 
7
7
  import pytest
8
8
  import uvicorn
9
+ from fastapi.testclient import TestClient
10
+ from httpx import Response
9
11
  from typer.testing import CliRunner
12
+ from uvicorn.importer import import_from_string
10
13
 
11
14
  from fastapi_cli.cli import app
12
15
  from fastapi_cli.utils.cli import get_uvicorn_log_config
@@ -18,7 +21,8 @@ assets_path = Path(__file__).parent / "assets"
18
21
 
19
22
 
20
23
  @pytest.fixture(autouse=True)
21
- def force_rich_logs(monkeypatch: pytest.MonkeyPatch) -> None:
24
+ def isolate_cli_environment(monkeypatch: pytest.MonkeyPatch) -> None:
25
+ monkeypatch.delenv("FASTAPI_ENV", raising=False)
22
26
  monkeypatch.setattr("fastapi_cli.cli.should_use_rich_logs", lambda: True)
23
27
 
24
28
 
@@ -53,6 +57,49 @@ def test_dev() -> None:
53
57
  assert "Configuration sources:" not in result.output
54
58
 
55
59
 
60
+ def _get_fastapi_env_response(*, command: str, fastapi_env: str | None) -> Response:
61
+ module_name = "environment_app"
62
+ sys.modules.pop(module_name, None)
63
+
64
+ try:
65
+ with changing_dir(assets_path):
66
+ with patch.object(uvicorn, "run") as mock_run:
67
+ result = runner.invoke(
68
+ app,
69
+ [command, f"{module_name}.py"],
70
+ env={"FASTAPI_ENV": fastapi_env},
71
+ )
72
+
73
+ assert result.exit_code == 0, result.output
74
+ assert mock_run.call_args
75
+ imported_app = import_from_string(mock_run.call_args.kwargs["app"])
76
+ with TestClient(imported_app) as test_client:
77
+ return test_client.get("/fastapi-env")
78
+ finally:
79
+ sys.modules.pop(module_name, None)
80
+
81
+
82
+ def test_dev_sets_fastapi_env_before_app_import() -> None:
83
+ response = _get_fastapi_env_response(command="dev", fastapi_env=None)
84
+
85
+ assert response.status_code == 200
86
+ assert response.json() == {"fastapi_env": "development"}
87
+
88
+
89
+ def test_dev_does_not_override_existing_fastapi_env() -> None:
90
+ response = _get_fastapi_env_response(command="dev", fastapi_env="chicken")
91
+
92
+ assert response.status_code == 200
93
+ assert response.json() == {"fastapi_env": "chicken"}
94
+
95
+
96
+ def test_run_does_not_set_fastapi_env() -> None:
97
+ response = _get_fastapi_env_response(command="run", fastapi_env=None)
98
+
99
+ assert response.status_code == 200
100
+ assert response.json() == {"fastapi_env": None}
101
+
102
+
56
103
  def test_run_uses_uvicorn_default_log_config_without_rich_logs(
57
104
  monkeypatch: pytest.MonkeyPatch,
58
105
  ) -> None:
@@ -1 +0,0 @@
1
- __version__ = "0.0.31"
File without changes