diff options
Diffstat (limited to 'venv/lib/python3.11/site-packages/sqlalchemy/util/typing.py')
| -rw-r--r-- | venv/lib/python3.11/site-packages/sqlalchemy/util/typing.py | 580 | 
1 files changed, 0 insertions, 580 deletions
diff --git a/venv/lib/python3.11/site-packages/sqlalchemy/util/typing.py b/venv/lib/python3.11/site-packages/sqlalchemy/util/typing.py deleted file mode 100644 index 2d9e225..0000000 --- a/venv/lib/python3.11/site-packages/sqlalchemy/util/typing.py +++ /dev/null @@ -1,580 +0,0 @@ -# util/typing.py -# Copyright (C) 2022-2024 the SQLAlchemy authors and contributors -# <see AUTHORS file> -# -# This module is part of SQLAlchemy and is released under -# the MIT License: https://www.opensource.org/licenses/mit-license.php -# mypy: allow-untyped-defs, allow-untyped-calls - -from __future__ import annotations - -import builtins -import collections.abc as collections_abc -import re -import sys -import typing -from typing import Any -from typing import Callable -from typing import cast -from typing import Dict -from typing import ForwardRef -from typing import Generic -from typing import Iterable -from typing import Mapping -from typing import NewType -from typing import NoReturn -from typing import Optional -from typing import overload -from typing import Set -from typing import Tuple -from typing import Type -from typing import TYPE_CHECKING -from typing import TypeVar -from typing import Union - -from . import compat - -if True:  # zimports removes the tailing comments -    from typing_extensions import Annotated as Annotated  # 3.8 -    from typing_extensions import Concatenate as Concatenate  # 3.10 -    from typing_extensions import ( -        dataclass_transform as dataclass_transform,  # 3.11, -    ) -    from typing_extensions import Final as Final  # 3.8 -    from typing_extensions import final as final  # 3.8 -    from typing_extensions import get_args as get_args  # 3.10 -    from typing_extensions import get_origin as get_origin  # 3.10 -    from typing_extensions import Literal as Literal  # 3.8 -    from typing_extensions import NotRequired as NotRequired  # 3.11 -    from typing_extensions import ParamSpec as ParamSpec  # 3.10 -    from typing_extensions import Protocol as Protocol  # 3.8 -    from typing_extensions import SupportsIndex as SupportsIndex  # 3.8 -    from typing_extensions import TypeAlias as TypeAlias  # 3.10 -    from typing_extensions import TypedDict as TypedDict  # 3.8 -    from typing_extensions import TypeGuard as TypeGuard  # 3.10 -    from typing_extensions import Self as Self  # 3.11 -    from typing_extensions import TypeAliasType as TypeAliasType  # 3.12 - -_T = TypeVar("_T", bound=Any) -_KT = TypeVar("_KT") -_KT_co = TypeVar("_KT_co", covariant=True) -_KT_contra = TypeVar("_KT_contra", contravariant=True) -_VT = TypeVar("_VT") -_VT_co = TypeVar("_VT_co", covariant=True) - - -if compat.py310: -    # why they took until py310 to put this in stdlib is beyond me, -    # I've been wanting it since py27 -    from types import NoneType as NoneType -else: -    NoneType = type(None)  # type: ignore - -NoneFwd = ForwardRef("None") - -typing_get_args = get_args -typing_get_origin = get_origin - - -_AnnotationScanType = Union[ -    Type[Any], str, ForwardRef, NewType, TypeAliasType, "GenericProtocol[Any]" -] - - -class ArgsTypeProcotol(Protocol): -    """protocol for types that have ``__args__`` - -    there's no public interface for this AFAIK - -    """ - -    __args__: Tuple[_AnnotationScanType, ...] - - -class GenericProtocol(Protocol[_T]): -    """protocol for generic types. - -    this since Python.typing _GenericAlias is private - -    """ - -    __args__: Tuple[_AnnotationScanType, ...] -    __origin__: Type[_T] - -    # Python's builtin _GenericAlias has this method, however builtins like -    # list, dict, etc. do not, even though they have ``__origin__`` and -    # ``__args__`` -    # -    # def copy_with(self, params: Tuple[_AnnotationScanType, ...]) -> Type[_T]: -    #     ... - - -# copied from TypeShed, required in order to implement -# MutableMapping.update() -class SupportsKeysAndGetItem(Protocol[_KT, _VT_co]): -    def keys(self) -> Iterable[_KT]: ... - -    def __getitem__(self, __k: _KT) -> _VT_co: ... - - -# work around https://github.com/microsoft/pyright/issues/3025 -_LiteralStar = Literal["*"] - - -def de_stringify_annotation( -    cls: Type[Any], -    annotation: _AnnotationScanType, -    originating_module: str, -    locals_: Mapping[str, Any], -    *, -    str_cleanup_fn: Optional[Callable[[str, str], str]] = None, -    include_generic: bool = False, -    _already_seen: Optional[Set[Any]] = None, -) -> Type[Any]: -    """Resolve annotations that may be string based into real objects. - -    This is particularly important if a module defines "from __future__ import -    annotations", as everything inside of __annotations__ is a string. We want -    to at least have generic containers like ``Mapped``, ``Union``, ``List``, -    etc. - -    """ -    # looked at typing.get_type_hints(), looked at pydantic.  We need much -    # less here, and we here try to not use any private typing internals -    # or construct ForwardRef objects which is documented as something -    # that should be avoided. - -    original_annotation = annotation - -    if is_fwd_ref(annotation): -        annotation = annotation.__forward_arg__ - -    if isinstance(annotation, str): -        if str_cleanup_fn: -            annotation = str_cleanup_fn(annotation, originating_module) - -        annotation = eval_expression( -            annotation, originating_module, locals_=locals_, in_class=cls -        ) - -    if ( -        include_generic -        and is_generic(annotation) -        and not is_literal(annotation) -    ): -        if _already_seen is None: -            _already_seen = set() - -        if annotation in _already_seen: -            # only occurs recursively.  outermost return type -            # will always be Type. -            # the element here will be either ForwardRef or -            # Optional[ForwardRef] -            return original_annotation  # type: ignore -        else: -            _already_seen.add(annotation) - -        elements = tuple( -            de_stringify_annotation( -                cls, -                elem, -                originating_module, -                locals_, -                str_cleanup_fn=str_cleanup_fn, -                include_generic=include_generic, -                _already_seen=_already_seen, -            ) -            for elem in annotation.__args__ -        ) - -        return _copy_generic_annotation_with(annotation, elements) -    return annotation  # type: ignore - - -def _copy_generic_annotation_with( -    annotation: GenericProtocol[_T], elements: Tuple[_AnnotationScanType, ...] -) -> Type[_T]: -    if hasattr(annotation, "copy_with"): -        # List, Dict, etc. real generics -        return annotation.copy_with(elements)  # type: ignore -    else: -        # Python builtins list, dict, etc. -        return annotation.__origin__[elements]  # type: ignore - - -def eval_expression( -    expression: str, -    module_name: str, -    *, -    locals_: Optional[Mapping[str, Any]] = None, -    in_class: Optional[Type[Any]] = None, -) -> Any: -    try: -        base_globals: Dict[str, Any] = sys.modules[module_name].__dict__ -    except KeyError as ke: -        raise NameError( -            f"Module {module_name} isn't present in sys.modules; can't " -            f"evaluate expression {expression}" -        ) from ke - -    try: -        if in_class is not None: -            cls_namespace = dict(in_class.__dict__) -            cls_namespace.setdefault(in_class.__name__, in_class) - -            # see #10899.  We want the locals/globals to take precedence -            # over the class namespace in this context, even though this -            # is not the usual way variables would resolve. -            cls_namespace.update(base_globals) - -            annotation = eval(expression, cls_namespace, locals_) -        else: -            annotation = eval(expression, base_globals, locals_) -    except Exception as err: -        raise NameError( -            f"Could not de-stringify annotation {expression!r}" -        ) from err -    else: -        return annotation - - -def eval_name_only( -    name: str, -    module_name: str, -    *, -    locals_: Optional[Mapping[str, Any]] = None, -) -> Any: -    if "." in name: -        return eval_expression(name, module_name, locals_=locals_) - -    try: -        base_globals: Dict[str, Any] = sys.modules[module_name].__dict__ -    except KeyError as ke: -        raise NameError( -            f"Module {module_name} isn't present in sys.modules; can't " -            f"resolve name {name}" -        ) from ke - -    # name only, just look in globals.  eval() works perfectly fine here, -    # however we are seeking to have this be faster, as this occurs for -    # every Mapper[] keyword, etc. depending on configuration -    try: -        return base_globals[name] -    except KeyError as ke: -        # check in builtins as well to handle `list`, `set` or `dict`, etc. -        try: -            return builtins.__dict__[name] -        except KeyError: -            pass - -        raise NameError( -            f"Could not locate name {name} in module {module_name}" -        ) from ke - - -def resolve_name_to_real_class_name(name: str, module_name: str) -> str: -    try: -        obj = eval_name_only(name, module_name) -    except NameError: -        return name -    else: -        return getattr(obj, "__name__", name) - - -def de_stringify_union_elements( -    cls: Type[Any], -    annotation: ArgsTypeProcotol, -    originating_module: str, -    locals_: Mapping[str, Any], -    *, -    str_cleanup_fn: Optional[Callable[[str, str], str]] = None, -) -> Type[Any]: -    return make_union_type( -        *[ -            de_stringify_annotation( -                cls, -                anno, -                originating_module, -                {}, -                str_cleanup_fn=str_cleanup_fn, -            ) -            for anno in annotation.__args__ -        ] -    ) - - -def is_pep593(type_: Optional[_AnnotationScanType]) -> bool: -    return type_ is not None and typing_get_origin(type_) is Annotated - - -def is_non_string_iterable(obj: Any) -> TypeGuard[Iterable[Any]]: -    return isinstance(obj, collections_abc.Iterable) and not isinstance( -        obj, (str, bytes) -    ) - - -def is_literal(type_: _AnnotationScanType) -> bool: -    return get_origin(type_) is Literal - - -def is_newtype(type_: Optional[_AnnotationScanType]) -> TypeGuard[NewType]: -    return hasattr(type_, "__supertype__") - -    # doesn't work in 3.8, 3.7 as it passes a closure, not an -    # object instance -    # return isinstance(type_, NewType) - - -def is_generic(type_: _AnnotationScanType) -> TypeGuard[GenericProtocol[Any]]: -    return hasattr(type_, "__args__") and hasattr(type_, "__origin__") - - -def is_pep695(type_: _AnnotationScanType) -> TypeGuard[TypeAliasType]: -    return isinstance(type_, TypeAliasType) - - -def flatten_newtype(type_: NewType) -> Type[Any]: -    super_type = type_.__supertype__ -    while is_newtype(super_type): -        super_type = super_type.__supertype__ -    return super_type - - -def is_fwd_ref( -    type_: _AnnotationScanType, check_generic: bool = False -) -> TypeGuard[ForwardRef]: -    if isinstance(type_, ForwardRef): -        return True -    elif check_generic and is_generic(type_): -        return any(is_fwd_ref(arg, True) for arg in type_.__args__) -    else: -        return False - - -@overload -def de_optionalize_union_types(type_: str) -> str: ... - - -@overload -def de_optionalize_union_types(type_: Type[Any]) -> Type[Any]: ... - - -@overload -def de_optionalize_union_types( -    type_: _AnnotationScanType, -) -> _AnnotationScanType: ... - - -def de_optionalize_union_types( -    type_: _AnnotationScanType, -) -> _AnnotationScanType: -    """Given a type, filter out ``Union`` types that include ``NoneType`` -    to not include the ``NoneType``. - -    """ - -    if is_fwd_ref(type_): -        return de_optionalize_fwd_ref_union_types(type_) - -    elif is_optional(type_): -        typ = set(type_.__args__) - -        typ.discard(NoneType) -        typ.discard(NoneFwd) - -        return make_union_type(*typ) - -    else: -        return type_ - - -def de_optionalize_fwd_ref_union_types( -    type_: ForwardRef, -) -> _AnnotationScanType: -    """return the non-optional type for Optional[], Union[None, ...], x|None, -    etc. without de-stringifying forward refs. - -    unfortunately this seems to require lots of hardcoded heuristics - -    """ - -    annotation = type_.__forward_arg__ - -    mm = re.match(r"^(.+?)\[(.+)\]$", annotation) -    if mm: -        if mm.group(1) == "Optional": -            return ForwardRef(mm.group(2)) -        elif mm.group(1) == "Union": -            elements = re.split(r",\s*", mm.group(2)) -            return make_union_type( -                *[ForwardRef(elem) for elem in elements if elem != "None"] -            ) -        else: -            return type_ - -    pipe_tokens = re.split(r"\s*\|\s*", annotation) -    if "None" in pipe_tokens: -        return ForwardRef("|".join(p for p in pipe_tokens if p != "None")) - -    return type_ - - -def make_union_type(*types: _AnnotationScanType) -> Type[Any]: -    """Make a Union type. - -    This is needed by :func:`.de_optionalize_union_types` which removes -    ``NoneType`` from a ``Union``. - -    """ -    return cast(Any, Union).__getitem__(types)  # type: ignore - - -def expand_unions( -    type_: Type[Any], include_union: bool = False, discard_none: bool = False -) -> Tuple[Type[Any], ...]: -    """Return a type as a tuple of individual types, expanding for -    ``Union`` types.""" - -    if is_union(type_): -        typ = set(type_.__args__) - -        if discard_none: -            typ.discard(NoneType) - -        if include_union: -            return (type_,) + tuple(typ)  # type: ignore -        else: -            return tuple(typ)  # type: ignore -    else: -        return (type_,) - - -def is_optional(type_: Any) -> TypeGuard[ArgsTypeProcotol]: -    return is_origin_of( -        type_, -        "Optional", -        "Union", -        "UnionType", -    ) - - -def is_optional_union(type_: Any) -> bool: -    return is_optional(type_) and NoneType in typing_get_args(type_) - - -def is_union(type_: Any) -> TypeGuard[ArgsTypeProcotol]: -    return is_origin_of(type_, "Union") - - -def is_origin_of_cls( -    type_: Any, class_obj: Union[Tuple[Type[Any], ...], Type[Any]] -) -> bool: -    """return True if the given type has an __origin__ that shares a base -    with the given class""" - -    origin = typing_get_origin(type_) -    if origin is None: -        return False - -    return isinstance(origin, type) and issubclass(origin, class_obj) - - -def is_origin_of( -    type_: Any, *names: str, module: Optional[str] = None -) -> bool: -    """return True if the given type has an __origin__ with the given name -    and optional module.""" - -    origin = typing_get_origin(type_) -    if origin is None: -        return False - -    return _get_type_name(origin) in names and ( -        module is None or origin.__module__.startswith(module) -    ) - - -def _get_type_name(type_: Type[Any]) -> str: -    if compat.py310: -        return type_.__name__ -    else: -        typ_name = getattr(type_, "__name__", None) -        if typ_name is None: -            typ_name = getattr(type_, "_name", None) - -        return typ_name  # type: ignore - - -class DescriptorProto(Protocol): -    def __get__(self, instance: object, owner: Any) -> Any: ... - -    def __set__(self, instance: Any, value: Any) -> None: ... - -    def __delete__(self, instance: Any) -> None: ... - - -_DESC = TypeVar("_DESC", bound=DescriptorProto) - - -class DescriptorReference(Generic[_DESC]): -    """a descriptor that refers to a descriptor. - -    used for cases where we need to have an instance variable referring to an -    object that is itself a descriptor, which typically confuses typing tools -    as they don't know when they should use ``__get__`` or not when referring -    to the descriptor assignment as an instance variable. See -    sqlalchemy.orm.interfaces.PropComparator.prop - -    """ - -    if TYPE_CHECKING: - -        def __get__(self, instance: object, owner: Any) -> _DESC: ... - -        def __set__(self, instance: Any, value: _DESC) -> None: ... - -        def __delete__(self, instance: Any) -> None: ... - - -_DESC_co = TypeVar("_DESC_co", bound=DescriptorProto, covariant=True) - - -class RODescriptorReference(Generic[_DESC_co]): -    """a descriptor that refers to a descriptor. - -    same as :class:`.DescriptorReference` but is read-only, so that subclasses -    can define a subtype as the generically contained element - -    """ - -    if TYPE_CHECKING: - -        def __get__(self, instance: object, owner: Any) -> _DESC_co: ... - -        def __set__(self, instance: Any, value: Any) -> NoReturn: ... - -        def __delete__(self, instance: Any) -> NoReturn: ... - - -_FN = TypeVar("_FN", bound=Optional[Callable[..., Any]]) - - -class CallableReference(Generic[_FN]): -    """a descriptor that refers to a callable. - -    works around mypy's limitation of not allowing callables assigned -    as instance variables - - -    """ - -    if TYPE_CHECKING: - -        def __get__(self, instance: object, owner: Any) -> _FN: ... - -        def __set__(self, instance: Any, value: _FN) -> None: ... - -        def __delete__(self, instance: Any) -> None: ... - - -# $def ro_descriptor_reference(fn: Callable[])  | 
