Metadata-Version: 2.1
Name: steroid
Version: 0.7b0
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
from typing import Union

import pydantic
from fastapi import Header, HTTPException, Request
from typing_extensions import TypedDict

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


class Salute(pydantic.BaseModel):
  aye: str


class Hello(TypedDict):
  pk: str
  gID: int
  XToken: Union[str, None]


class GreetResponse(TypedDict):
  hello: Hello


class NoHello(TypedDict):
  aye: str


class NoGreetResponse(TypedDict):
  noHello: NoHello


class AuthMiddleware(Middleware):
  HOOK = "PRE"

  def action(request: Request):
    authToken = request.headers.get("Authorization")
    if 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")


@UseMiddlewares(AuthMiddleware)
@Controller("greetings")
class GreetController:
  @Get("greet/{pk}/{gID}")
  def Greet(
    pk: str,
    gID: int,
    x_token: str = Header(default=None),
  ) -> GreetResponse:
    return {"hello": {"pk": pk, "gID": gID, "XToken": x_token}}

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


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


app = CreateApp()

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

if __name__ == "__main__":
  app.start()

```
