fastapi-users / fastapi-users-db-beanie

FastAPI Users database adapter for Beanie
MIT License
5 stars 4 forks source link

BeanieUserDatabase type check fails with Pyright #12

Open barraponto opened 1 year ago

barraponto commented 1 year ago

Describe the bug

Pyright complains when BeanieUserDatabase gets a subclass of both BeanieBaseUser and beanie.Document.

Argument of type "type[User]" cannot be assigned to parameter "user_model" of type "type[UP_BEANIE@BeanieUserDatabase]" in function "__init__"

To Reproduce

from beanie import Document
from fastapi_users.db import BeanieBaseUser
from fastapi_users_db_beanie import BeanieUserDatabase

class User(BeanieBaseUser, Document):
    pass

async def get_user_db():
    return BeanieUserDatabase(User)

Expected behavior

No type errors.

Configuration

Additional context

Particularly, I see BeanieBaseUserDocument defined as literally a subclass of both BeanieBaseUser and beanie.Document. But defining a TypeVar bond to BeanieBaseUserDocument does not accept another subclass of the same classes :/

barraponto commented 1 year ago

So, can you narrow the generic TypeVar to a subclass of two classes, as to ensure it has every property in both classes? No. Well, not in Python, at least for now. There's a Stackoverflow Q&A that correctly points the issue to the lack of Type Intersections in Python. There's a mile-long issue about it in the python/typing repo, but TLDR we're going to wait a while for support to land.

barraponto commented 1 year ago

As a pragmatic solution to this issue, can we make BeanieBaseUserDocument importable from fastapi_users.db? Would subclassing it have any nefarious side effect?