diff --git a/tests/test_pages.py b/tests/test_pages.py index 6aeb1051..b5845473 100644 --- a/tests/test_pages.py +++ b/tests/test_pages.py @@ -68,8 +68,16 @@ def to_item(self) -> dict: # type: ignore "foo": "bar", } + from collections.abc import Set as CollectionsSet + from typing import Set as TypingSet + assert is_injectable(None) is False assert is_injectable(type(None)) is False + assert is_injectable(set) is False + assert is_injectable(set[str]) is False + assert is_injectable(TypingSet[str]) is False + assert is_injectable(CollectionsSet[str]) is False + assert is_injectable(Optional[str]) is False assert is_injectable(MyClass) is False assert is_injectable(MyClass()) is False assert is_injectable(MyItemPage) is True diff --git a/web_poet/pages.py b/web_poet/pages.py index 99a0f315..26d31afb 100644 --- a/web_poet/pages.py +++ b/web_poet/pages.py @@ -2,6 +2,7 @@ import inspect from contextlib import suppress from functools import wraps +from types import GenericAlias from typing import Any, Generic, Optional, TypeVar, overload import attr @@ -38,7 +39,11 @@ class Injectable(abc.ABC, FieldsMixin): def is_injectable(cls: Any) -> bool: """Return True if ``cls`` is a class which inherits from :class:`~.Injectable`.""" - return isinstance(cls, type) and issubclass(cls, Injectable) + return ( + not isinstance(cls, GenericAlias) + and isinstance(cls, type) + and issubclass(cls, Injectable) + ) ItemT = TypeVar("ItemT")