8000 feat: Enable configuration via pyproject.toml and environment variables by mattmess1221 · Pull Request #18 · fastapi/fastapi-cli · GitHub
[go: up one dir, main page]

Skip to content

feat: Enable configuration via pyproject.toml and environment variables #18

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
Prev Previous commit
Next Next commit
Simplify test import cleaner
  • Loading branch information
mattmess1221 committed May 16, 2024
commit 2b56256d84d25887efe3aba064151d3a2b0d3b34
24 changes: 24 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import inspect
import sys
from pathlib import Path
from typing import Generator

import pytest
from fastapi_cli.logging import setup_logging
from typer import rich_utils

assets_path = Path(__file__).parent / "assets"


@pytest.fixture(autouse=True)
def reset_syspath() -> Generator[None, None, None]:
Expand All @@ -21,3 +25,23 @@ def setup_terminal() -> None:
rich_utils.FORCE_TERMINAL = False
setup_logging(terminal_width=3000)
return


@pytest.fixture(autouse=True)
def asset_import_cleaner() -> Generator[None, None, None]:
existing_imports = set(sys.modules.keys())
try:
yield
finally:
# clean up imports
new_imports = set(sys.modules.keys()) ^ existing_imports
for name in new_imports:
try:
mod_file = inspect.getfile(sys.modules[name])
except TypeError:
# builtin, ignore
pass
else:
# only clean up imports from the test directory
if mod_file.startswith(str(assets_path)):
del sys.modules[name]
10 changes: 2 additions & 8 deletions tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,21 @@
import subprocess
import sys
from pathlib import Path
from typing import Any, Generator
from typing import Any
from unittest.mock import patch

import pytest
import uvicorn
from fastapi_cli.cli import app
from typer.testing import CliRunner

from tests.utils import changing_dir, importing
from tests.utils import changing_dir

runner = CliRunner()

assets_path = Path(__file__).parent / "assets"


@pytest.fixture(autouse=True)
def single_file_app_fixture() -> Generator[None, None, None]:
with importing(["single_file_app", "server", "app"]):
yield


def test_dev() -> None:
with changing_dir(assets_path):
with patch.object(uvicorn, "run") as mock_run:
Expand Down
9 changes: 1 addition & 8 deletions tests/test_utils_default_dir.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,15 @@
from pathlib import Path
from typing import Generator

import pytest
from fastapi_cli.discover import get_import_string
from fastapi_cli.exceptions import FastAPICLIException
from pytest import CaptureFixture

from .utils import changing_dir, importing
from .utils import changing_dir

assets_path = Path(__file__).parent / "assets"


@pytest.fixture(autouse=True)
def single_file_app_fixture() -> Generator[None, None, None]:
with importing(["app", "app.main", "app.app", "app.api"]):
yield


def test_app_dir_main(capsys: CaptureFixture[str]) -> None:
with changing_dir(assets_path / "default_files" / "default_app_dir_main"):
import_string = get_import_string()
Expand Down
9 changes: 1 addition & 8 deletions tests/test_utils_default_file.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,17 @@
import importlib
import sys
from pathlib import Path
from typing import Generator

import pytest
from fastapi_cli.discover import get_import_string
from fastapi_cli.exceptions import FastAPICLIException
from pytest import CaptureFixture

from .utils import changing_dir, importing
from .utils import changing_dir

assets_path = Path(__file__).parent / "assets"


@pytest.fixture(autouse=True)
def single_file_app_fixture() -> Generator[None, None, None]:
with importing(["app", "api", "main"]):
yield


def test_single_file_main(capsys: CaptureFixture[str]) -> None:
root_path = assets_path / "default_files" / "default_main"
old_sys_path = sys.path.copy()
Expand Down
17 changes: 1 addition & 16 deletions tests/test_utils_package.py
Original file line number Diff line number Diff line change
@@ -1,30 +1,15 @@
from pathlib import Path
from typing import Generator

import pytest
from fastapi_cli.discover import get_import_string
from fastapi_cli.exceptions import FastAPICLIException
from pytest import CaptureFixture

from tests.utils import changing_dir, importing
from tests.utils import changing_dir

assets_path = Path(__file__).parent / "assets"


@pytest.fixture(autouse=True)
def single_file_app_fixture() -> Generator[None, None, None]:
with importing(
[
"package",
"package.mod",
"package.mod.app",
"package.mod.api",
"package.mod.other",
]
):
yield


def test_package_app_root(capsys: CaptureFixture[str]) -> None:
with changing_dir(assets_path):
import_string = get_import_string(path=Path("package/mod/app.py"))
Expand Down
9 changes: 1 addition & 8 deletions tests/test_utils_single_file.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,15 @@
from pathlib import Path
from typing import Generator

import pytest
from fastapi_cli.discover import get_import_string
from fastapi_cli.exceptions import FastAPICLIException
from pytest import CaptureFixture

from .utils import changing_dir, importing
from .utils import changing_dir

assets_path = Path(__file__).parent / "assets"


@pytest.fixture(autouse=True)
def single_file_app_fixture() -> Generator[None, None, None]:
with importing(["single_file_app", "single_file_api", "single_file_other"]):
yield


def test_single_file_app(capsys: CaptureFixture[str]) -> None:
with changing_dir(assets_path):
import_string = get_import_string(path=Path("single_file_app.py"))
Expand Down
21 changes: 0 additions & 21 deletions tests/utils.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
from __future__ import annotations

import os
import sys
import warnings
from contextlib import contextmanager
from pathlib import Path
from typing import Generator, Union
Expand All @@ -16,20 +12,3 @@ def changing_dir(directory: Union[str, Path]) -> Generator[None, None, None]:
yield
finally:
os.chdir(initial_dir)


@contextmanager
def importing(names: list[str]) -> Generator[None, None, None]:
for name in names:
if name in sys.modules: # pragma: no cover
warnings.warn(
f"{name} is already imported",
category=UserWarning,
stacklevel=1,
)
try:
yield
finally:
for name in names:
if name in sys.modules:
del sys.modules[name]
0