#!/usr/bin/env python
"""
Magpie additional typing definitions.
"""
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from typing import Any
from typing import AnyStr as _AnyStr
from typing import Dict, Iterable, List, Tuple, Union
import six
from pyramid.config import Configurator
from pyramid.httpexceptions import HTTPException
from pyramid.registry import Registry
from pyramid.request import Request
from pyramid.response import Response as PyramidResponse
from requests.cookies import RequestsCookieJar
from requests.structures import CaseInsensitiveDict
from sqlalchemy.orm.session import Session
from webob.headers import EnvironHeaders, ResponseHeaders
from webob.response import Response as WebobResponse
from webtest.response import TestResponse
from magpie import models
from magpie.permissions import Permission
# pylint: disable=W0611,unused-import # following definitions provided to be employed elsewhere in the code
if six.PY2:
# pylint: disable=E0602,undefined-variable # unicode not recognized by python 3
[docs] Str = Union[_AnyStr, unicode] # noqa: E0602,F405,F821
else:
Str = _AnyStr
AnyStr = Str # pylint: disable=C0103,invalid-name
Number = Union[int, float]
SettingValue = Union[Str, Number, bool, None]
SettingsType = Dict[Str, SettingValue]
AnySettingsContainer = Union[Configurator, Registry, Request, SettingsType]
ParamsType = Dict[Str, Any]
CookiesType = Union[Dict[Str, Str], List[Tuple[Str, Str]]]
HeadersType = Union[Dict[Str, Str], List[Tuple[Str, Str]]]
AnyHeadersType = Union[HeadersType, ResponseHeaders, EnvironHeaders, CaseInsensitiveDict]
AnyCookiesType = Union[CookiesType, RequestsCookieJar]
AnyResponseType = Union[WebobResponse, PyramidResponse, HTTPException, TestResponse]
CookiesOrSessionType = Union[RequestsCookieJar, Session]
AnyKey = Union[Str, int]
AnyValue = Union[Str, Number, bool, None]
BaseJSON = Union[AnyValue, List["BaseJSON"], Dict[AnyKey, "BaseJSON"]]
JSON = Union[Dict[AnyKey, Union[BaseJSON, "JSON"]], List[BaseJSON]]
# recursive nodes structure employed by functions for listing children resources hierarchy
# {<res-id>: {"node": <res>, "children": {<res-id>: ... }}
ChildrenResourceNodes = Dict[int, Dict[Str, Union[models.Resource, "ChildrenResourceNodes"]]]
ResourcePermissionMap = Dict[int, List[Str]] # raw mapping of permission-names applied per resource ID
UserServicesType = Union[Dict[Str, Dict[Str, Any]], List[Dict[Str, Any]]]
ServiceOrResourceType = Union[models.Service, models.Resource]
ResourcePermissionType = Union[models.GroupPermission, models.UserPermission]
AnyPermissionType = Union[Permission, ResourcePermissionType, Str]
AnyAccessPrincipalType = Union[Str, Iterable[Str]]
AccessControlListType = List[Union[Tuple[Str, Str, Str], Str]]