diff --git a/fastapi_startkit/src/fastapi_startkit/support/providers/provider.py b/fastapi_startkit/src/fastapi_startkit/support/providers/provider.py index b0c56046..4a88a1e0 100644 --- a/fastapi_startkit/src/fastapi_startkit/support/providers/provider.py +++ b/fastapi_startkit/src/fastapi_startkit/support/providers/provider.py @@ -1,4 +1,5 @@ from collections.abc import Callable +from pathlib import Path from typing import TYPE_CHECKING, Any from fastapi_startkit.support import Str @@ -10,13 +11,13 @@ class Provider: - provider_key: str | None = None + provider_key: str = "" def __init__(self, application: "Application[AppConfig]", config: dict[str, Any] | None = None): self.app: "Application[AppConfig]" = application self.config = config or {} - if self.provider_key is None: + if not self.provider_key: self.provider_key = str(Str.of(self.__class__.__name__).trim("ServiceProvider").trim("Provider").slugify()) def register(self) -> None: @@ -34,7 +35,7 @@ def resolve_config(self, default: Callable[[], object]) -> dict[str, Any]: def merge_config_from(self, source: str | dict, provider_key: str) -> None: self.app.make("config").merge_with(provider_key, source) - def publishes(self, resources: dict[str, Any], tag: str | None = None) -> None: + def publishes(self, resources: dict[str | Path, str], tag: str | None = None) -> None: self.app.published_resources.setdefault(self.provider_key, {}).update(resources) def commands(self, commands: list) -> None: diff --git a/fastapi_startkit/tests/core/test_providers.py b/fastapi_startkit/tests/core/test_providers.py index 68cfbfa5..8c92f75f 100644 --- a/fastapi_startkit/tests/core/test_providers.py +++ b/fastapi_startkit/tests/core/test_providers.py @@ -1,5 +1,7 @@ """Tests for the Provider pattern (task #10).""" +from pathlib import Path + import pytest from fastapi_startkit.application import Application @@ -115,6 +117,26 @@ class DatabaseProvider(Provider): p = DatabaseProvider(app) assert p.provider_key == "database" + def test_empty_provider_key_is_inferred(self, app): + class BlankKeyProvider(Provider): + provider_key = "" + + p = BlankKeyProvider(app) + assert p.provider_key == "blankkey" + + def test_publishes_accepts_str_and_path_sources(self, app): + class AssetsProvider(Provider): + pass + + p = AssetsProvider(app) + p.publishes({"/stubs/a.py": "config/a.py"}) + p.publishes({Path("/stubs/b.py"): "config/b.py"}) + + assert app.published_resources["assets"] == { + "/stubs/a.py": "config/a.py", + Path("/stubs/b.py"): "config/b.py", + } + # --------------------------------------------------------------------------- # register() phase