Metadata-Version: 2.1
Name: steroid
Version: 0.8b0
Summary: Steroid
Home-page: https://github.com/struckchure/steroid
Author: Mohammed Al Ameen
Author-email: ameenmohammed2311@gmail.com
Requires-Python: >=3.8,<4.0
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Requires-Dist: annotated-types (==0.5.0)
Requires-Dist: anyio (==3.7.1)
Requires-Dist: black (==23.7.0)
Requires-Dist: click (==8.1.5)
Requires-Dist: exceptiongroup (==1.1.2)
Requires-Dist: fastapi (==0.100.0)
Requires-Dist: h11 (==0.14.0)
Requires-Dist: idna (==3.4)
Requires-Dist: mypy-extensions (==1.0.0)
Requires-Dist: packaging (==23.1)
Requires-Dist: pathspec (==0.11.1)
Requires-Dist: platformdirs (==3.9.1)
Requires-Dist: pydantic (==2.0.3)
Requires-Dist: pydantic-core (==2.3.0)
Requires-Dist: sniffio (==1.3.0)
Requires-Dist: starlette (==0.27.0)
Requires-Dist: tomli (==2.0.1)
Requires-Dist: typing-extensions (==4.7.1)
Requires-Dist: uvicorn (==0.23.0)
Project-URL: Repository, https://github.com/struckchure/steroid
Description-Content-Type: text/markdown

# steroid

Steroid is a Python library built on top of FastAPI, designed to provide developers with a framework for building high-performance APIs using a structured architecture inspired by NestJs.

# Installation
```bash
$ pip install steroid
```

# Usage

```python
import pydantic
from fastapi import Header, HTTPException, Request

from steroid import Controller, CreateApp, Get, Middleware, Post, UseMiddlewares


class Salute(pydantic.BaseModel):
    aye: str


class AuthMiddleware(Middleware):
    HOOK = "POST"

    def action(request: Request):
        authToken = request.headers.get("Authorization")
        if authToken is None or not authToken:
            raise HTTPException(status_code=401, detail="Unauthorized")


class PreMiddleware(Middleware):
    HOOK = "PRE"

    def action(request: Request):
        print("hello")


class PostMiddleware(Middleware):
    HOOK = "POST"

    def action(request: Request):
        print("bye")


@Controller("greetings")
class GreetController:
    @Get("greet/{pk}/{gID}")
    def Greet(
        pk: str,
        gID: int,
        authorization: str = Header(alias="Authorization", default=None),
    ):
        return {"hello": {"pk": pk, "gID": gID, "XToken": authorization}}

    @UseMiddlewares(AuthMiddleware)
    @Post("no-greet")
    def NoGreet(salute: Salute):
        return {"noHello": salute}


@Controller("clutch")
class CluthController:
    @UseMiddlewares(PreMiddleware, PostMiddleware)
    @Get("savage")
    def Savage():
        return {"hello": "clutchers, savage, and everything else"}

    @Get("not-a-savage")
    def NotASavage():
        return {"hello": "clutchers, not a savage, and everything else"}


def main():
    app = CreateApp()

    app.addController(GreetController)
    app.addController(CluthController)
    app.start()


if __name__ == "__main__":
    main()
```

# Start server
```bash
$ python example.py
[23/07/2023, 19:19:57] INFO [Controller] GreetController {/greetings}
[23/07/2023, 19:19:57] INFO [Method] Mapped {/greetings/greet/{pk}/{gID}, GET} route
[23/07/2023, 19:19:57] INFO [Method] Mapped {/greetings/no-greet, POST} route
[23/07/2023, 19:19:57] INFO [Controller] CluthController {/clutch}
[23/07/2023, 19:19:58] INFO [Method] Mapped {/clutch/savage, GET} route
[23/07/2023, 19:19:58] INFO [Method] Mapped {/clutch/not-a-savage, GET} route
```

