Metadata-Version: 2.3
Name: stollen
Version: 0.2.11
Summary: An asynchronous framework to easily build a client-side API
Project-URL: Source, https://github.com/py-stollen/stollen
Project-URL: Issues, https://github.com/py-stollen/stollen/issues
Author-email: wakaree <nullmatawasoradesu@gmail.com>
Maintainer-email: wakaree <nullmatawasoradesu@gmail.com>
License-Expression: MIT
License-File: LICENSE
Keywords: api,asyncio,client,framework,wrapper
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Framework :: AsyncIO
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: >=3.9
Requires-Dist: aiohttp~=3.9.0
Requires-Dist: certifi>=2023.7.22
Requires-Dist: pydantic<2.10,>=2.4.1
Provides-Extra: dev
Requires-Dist: black~=24.10.0; extra == 'dev'
Requires-Dist: mypy~=1.10.0; extra == 'dev'
Requires-Dist: pre-commit~=3.6; extra == 'dev'
Requires-Dist: ruff~=0.6.0; extra == 'dev'
Description-Content-Type: text/x-rst


#######
stollen
#######

**stollen** is an asynchronous framework to easily build a client-side API.

Installation
------------

..  code-block:: bash

    pip install -U stollen

Example
-------

.. code-block:: python

    from __future__ import annotations

    import asyncio
    import logging

    from stollen import Stollen, StollenMethod, StollenObject
    from stollen.enums import HTTPMethod
    from stollen.exceptions import StollenAPIError


    class CoingeckoAPIError(StollenAPIError):
        pass


    class RateLimitError(CoingeckoAPIError):
        pass


    class Coingecko(Stollen):
        def __init__(self) -> None:
            super().__init__(
                base_url="https://api.coingecko.com/api/v3",
                error_message_key=["status", "error_message"],
                general_error_class=CoingeckoAPIError,
                error_codes={429: RateLimitError},
                stringify_detailed_errors=False,
            )

        async def ping(self) -> GeckoSays:
            call: Ping = Ping()
            return await self(call)


    class GeckoSays(StollenObject[Coingecko]):
        gecko_says: str


    class Ping(
        StollenMethod[GeckoSays, Coingecko],
        http_method=HTTPMethod.GET,
        api_method="/ping",
        returning=GeckoSays,
    ):
        pass


    async def main() -> None:
        logging.basicConfig(level=logging.DEBUG)
        async with Coingecko() as coingecko:
            gecko_says: GeckoSays = await coingecko.ping()
            logging.info(gecko_says)


    if __name__ == "__main__":
        asyncio.run(main())
