Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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:
Expand All @@ -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:
Expand Down
22 changes: 22 additions & 0 deletions fastapi_startkit/tests/core/test_providers.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
"""Tests for the Provider pattern (task #10)."""

from pathlib import Path

import pytest

from fastapi_startkit.application import Application
Expand Down Expand Up @@ -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
Expand Down
Loading