# -*- coding: utf-8 -*-
# Copyright © 2024 Ivan Konovalov
# This file is part of a Python library yadisk.
# This library is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published
# by the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public License
# along with this library; if not, see <http://www.gnu.org/licenses/>.
from typing import TYPE_CHECKING
from ._typing_compat import Type
if TYPE_CHECKING: # pragma: no cover
from ._session import Session
from ._async_session import AsyncSession
from .types import AsyncSessionName, SessionName
__all__ = ["import_session", "import_async_session"]
sessions = {
"httpx": ("sessions.httpx_session", "HTTPXSession"),
"pycurl": ("sessions.pycurl_session", "PycURLSession"),
"requests": ("sessions.requests_session", "RequestsSession")
}
async_sessions = {
"aiohttp": ("sessions.aiohttp_session", "AIOHTTPSession"),
"httpx": ("sessions.async_httpx_session", "AsyncHTTPXSession")
}
[docs]def import_session(name: "SessionName") -> Type["Session"]:
"""
Imports relevant session class based on provided name.
The following sessions are available:
* :code:`"httpx"` - :any:`HTTPXSession`
* :code:`"pycurl"` - :any:`PycURLSession`
* :code:`"requests"` - :any:`RequestsSession`
:param name: `str`, session name
:raises ImportError: could not import module
:raises ValueError: unknown name
:returns: subclass of :any:`Session`
"""
try:
module_path, class_name = sessions[name]
except KeyError:
raise ValueError(f"unknown session name: {repr(name)}") from None
return getattr(
__import__(module_path, globals(), locals(), level=1, fromlist=(class_name,)),
class_name
)
[docs]def import_async_session(name: "AsyncSessionName") -> Type["AsyncSession"]:
"""
Imports relevant asynchronous session class based on provided name.
:param name: `str`, session name
The following sessions are available:
* :code:`"aiohttp"` - :any:`AIOHTTPSession`
* :code:`"httpx"` - :any:`AsyncHTTPXSession`
:raises ImportError: could not import module
:raises ValueError: unknown name
:returns: subclass of :any:`AsyncSession`
"""
try:
module_path, class_name = async_sessions[name]
except KeyError:
raise ValueError(f"unknown asynchronous session name: {repr(name)}") from None
return getattr(
__import__(module_path, globals(), locals(), level=1, fromlist=(class_name,)),
class_name
)