fastapi's di is utter garbage

This commit is contained in:
Zoe Roux 2025-05-13 21:53:22 +02:00
parent 9bcca13cbc
commit 8592191808
No known key found for this signature in database
7 changed files with 24 additions and 37 deletions

View File

@ -5,7 +5,7 @@ from contextlib import asynccontextmanager
from fastapi import FastAPI
from scanner.client import KyooClient
from scanner.fsscan import Scanner
from scanner.fsscan import FsScanner
from scanner.providers.composite import CompositeProvider
from scanner.providers.themoviedatabase import TheMovieDatabase
from scanner.requests import RequestCreator, RequestProcessor
@ -25,13 +25,11 @@ async def lifespan(_):
get_db() as db,
KyooClient() as client,
TheMovieDatabase() as tmdb,
RequestProcessor(db, client, CompositeProvider(tmdb)) as processor
RequestProcessor(db, client, CompositeProvider(tmdb)) as processor,
):
# creating the processor makes it listen to requests event in pg
async with (
get_db() as db,
):
scanner = Scanner(client, RequestCreator(db))
async with get_db() as db:
scanner = FsScanner(client, RequestCreator(db))
# there's no way someone else used the same id, right?
is_master = await db.fetchval("select pg_try_advisory_lock(198347)")
if is_master:

View File

@ -3,12 +3,11 @@ import re
from logging import getLogger
from mimetypes import guess_file_type
from os.path import dirname, exists, isdir, join
from typing import Annotated
from fastapi import Depends
from watchfiles import Change, awatch
from .client import KyooClient
from .database import get_db
from .identifiers.identify import identify
from .models.metadataid import EpisodeId, MetadataId
from .models.videos import For, Video, VideoInfo
@ -17,12 +16,13 @@ from .requests import Request, RequestCreator
logger = getLogger(__name__)
class Scanner:
def __init__(
self,
client: Annotated[KyooClient, Depends(KyooClient)],
requests: Annotated[RequestCreator, Depends(RequestCreator)],
):
async def create_scanner():
async with get_db() as db:
yield FsScanner(KyooClient(), RequestCreator(db))
class FsScanner:
def __init__(self, client: KyooClient, requests: RequestCreator):
self._client = client
self._requests = requests
self._info: VideoInfo = None # type: ignore

View File

@ -1,19 +1,14 @@
from typing import Annotated, override
from typing import override
from fastapi import Depends
from langcodes import Language
from ..models.movie import Movie, SearchMovie
from ..models.serie import SearchSerie, Serie
from .provider import Provider
from .themoviedatabase import TheMovieDatabase
class CompositeProvider(Provider):
def __init__(
self,
themoviedb: Annotated[TheMovieDatabase, Depends],
):
def __init__(self, themoviedb: Provider):
self._tvdb: Provider = None # type: ignore
self._themoviedb = themoviedb

View File

@ -19,13 +19,13 @@ from ..models.season import Season, SeasonTranslation
from ..models.serie import SearchSerie, Serie, SerieStatus, SerieTranslation
from ..models.staff import Character, Person, Role, Staff
from ..models.studio import Studio, StudioTranslation
from ..utils import Singleton, clean, to_slug
from ..utils import clean, to_slug
from .provider import Provider, ProviderError
logger = getLogger(__name__)
class TheMovieDatabase(Provider, metaclass=Singleton):
class TheMovieDatabase(Provider):
THEMOVIEDB_API_ACCESS_TOKEN = "eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJjOWYzMjhhMDEwMTFiMjhmMjI0ODM3MTczOTVmYzNmYSIsIm5iZiI6MTU4MTYzMTExOS44NjgsInN1YiI6IjVlNDVjNjhmODNlZTY3MDAxMTFmMmU5NiIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.CeXrQwgB3roCAVs-Z2ayLRx99VIJbym7XSpcRjGzyLA"
def __init__(self) -> None:

View File

@ -2,14 +2,12 @@ from __future__ import annotations
from logging import getLogger
from types import TracebackType
from typing import Annotated, Literal
from typing import Literal
from asyncpg import Connection
from fastapi import Depends
from pydantic import Field, TypeAdapter
from .client import KyooClient
from .database import get_db
from .models.videos import Guess, Resource
from .providers.composite import CompositeProvider
from .utils import Model
@ -31,10 +29,7 @@ class Request(Model, extra="allow"):
class RequestCreator:
def __init__(
self,
database: Annotated[Connection, Depends(get_db)],
):
def __init__(self, database: Connection):
self._database = database
async def enqueue(self, requests: list[Request]):
@ -54,9 +49,9 @@ class RequestCreator:
class RequestProcessor:
def __init__(
self,
database: Annotated[Connection, Depends(get_db)],
client: Annotated[KyooClient, Depends],
providers: Annotated[CompositeProvider, Depends],
database: Connection,
client: KyooClient,
providers: CompositeProvider,
):
self._database = database
self._client = client

View File

@ -2,7 +2,7 @@ from typing import Annotated
from fastapi import APIRouter, BackgroundTasks, Depends, Security
from ..fsscan import Scanner
from ..fsscan import FsScanner, create_scanner
from ..jwt import validate_bearer
router = APIRouter()
@ -12,11 +12,10 @@ router = APIRouter()
"/scan",
status_code=204,
response_description="Scan started.",
response_model=None,
)
async def trigger_scan(
tasks: BackgroundTasks,
scanner: Annotated[Scanner, Depends(Scanner)],
scanner: Annotated[FsScanner, Depends(create_scanner)],
_: Annotated[None, Security(validate_bearer, scopes=["scanner.trigger"])],
):
"""

View File

@ -1,4 +1,4 @@
from abc import ABC, ABCMeta
from abc import ABCMeta
from typing import Annotated, Any, Callable, override
from langcodes import Language as BaseLanguage