Metadata-Version: 2.4
Name: nexios_contrib
Version: 0.3.2
Summary: Utility pack for Nexios
Author-email: Chidebele Dunamis <techwithdunamix@gmail.com>
License-Expression: BSD-3-Clause
License-File: LICENSE
Keywords: API,ASGI,HTTP,Python,async,asynchronous,backend,concurrent,framework,granian,real-time,scalable,uvicorn,web,web server,websocket
Requires-Python: >=3.9
Requires-Dist: nexios>=3.0.0
Provides-Extra: all
Requires-Dist: anyio>=4.0.0; extra == 'all'
Requires-Dist: click>=8.1.3; extra == 'all'
Requires-Dist: granian>=1.2.0; extra == 'all'
Requires-Dist: itsdangerous>=2.1.2; extra == 'all'
Requires-Dist: jinja2>=3.1.6; extra == 'all'
Requires-Dist: pyjwt>=2.7.0; extra == 'all'
Requires-Dist: python-multipart>=0.0.6; extra == 'all'
Requires-Dist: redis>=4.0.0; extra == 'all'
Requires-Dist: scalar-docs>=0.1.0; extra == 'all'
Requires-Dist: strawberry-graphql>=0.219.0; extra == 'all'
Requires-Dist: uvicorn>=0.27.0; extra == 'all'
Provides-Extra: dev
Requires-Dist: aiosqlite<0.20.0; extra == 'dev'
Requires-Dist: anyio>=4.0.0; extra == 'dev'
Requires-Dist: black>=23.0.0; extra == 'dev'
Requires-Dist: click>=8.1.3; extra == 'dev'
Requires-Dist: coverage<8.0,>=6.3; extra == 'dev'
Requires-Dist: granian>=1.2.0; extra == 'dev'
Requires-Dist: httpx<0.29.0,>=0.23.3; extra == 'dev'
Requires-Dist: isort>=5.13.2; extra == 'dev'
Requires-Dist: itsdangerous>=2.1.2; extra == 'dev'
Requires-Dist: jinja2>=3.1.6; extra == 'dev'
Requires-Dist: mypy>=1.15.0; extra == 'dev'
Requires-Dist: nexios>=3.2.0; extra == 'dev'
Requires-Dist: pyjwt>=2.7.0; extra == 'dev'
Requires-Dist: pytest-asyncio<0.27.0,>=0.25.3; extra == 'dev'
Requires-Dist: pytest<8.5.0,>=8.3.4; extra == 'dev'
Requires-Dist: python-multipart>=0.0.6; extra == 'dev'
Requires-Dist: redis>=4.0.0; extra == 'dev'
Requires-Dist: ruff>=0.0.256; extra == 'dev'
Requires-Dist: scalar-docs>=0.1.0; extra == 'dev'
Requires-Dist: strawberry-graphql>=0.219.0; extra == 'dev'
Requires-Dist: tortoise-orm>=0.20.0; extra == 'dev'
Requires-Dist: typing-extensions==4.12.2; extra == 'dev'
Requires-Dist: uvicorn>=0.27.0; extra == 'dev'
Provides-Extra: graphql
Requires-Dist: strawberry-graphql>=0.219.0; extra == 'graphql'
Provides-Extra: redis
Requires-Dist: redis>=4.0.0; extra == 'redis'
Provides-Extra: scalar
Requires-Dist: scalar-docs>=0.1.0; extra == 'scalar'
Provides-Extra: templating
Requires-Dist: jinja2>=3.1.6; extra == 'templating'
Provides-Extra: tortoise
Requires-Dist: aiosqlite<0.20.0; extra == 'tortoise'
Requires-Dist: tortoise-orm>=0.20.0; extra == 'tortoise'
Description-Content-Type: text/markdown

<p align="center">
  <a href="https://github.com/nexios-labs">
    <img alt="Nexios Logo" height="350" src="https://nexios-labs.github.io/nexios/logo.png"> 
  </a>
</p>

<h1 align="center">Nexios Contrib</h1>

Community-driven extensions and add‑ons for the **[Nexios](https://nexios-labs.github.io/nexios/)** ASGI framework. This repository hosts independently versioned packages that you can install a‑la‑carte or together via the meta package.

📖 **[View Documentation](https://nexios-labs.github.io/nexios/community/)** | 🚀 **[Get Started](https://nexios-labs.github.io/nexios/community/)**

---

## Packages

- **URL Normalization Middleware**: `nexios_contrib.slashes`
  - README: [nexios_contrib/slashes/README.md](./nexios_contrib/slashes/README.md)
  - Handles trailing slashes, double slashes, and URL normalization for consistent, clean URLs.

- **Trusted Host Middleware**: `nexios_contrib.trusted`
  - README: [nexios_contrib/trusted/README.md](./nexios_contrib/trusted/README.md)
  - Validates the `Host` header against allowed hosts to prevent Host header attacks and ensure requests come from trusted domains.

- **ETag Middleware**: `nexios_contrib.etag`
  - README: [nexios_contrib/etag/README.md](./nexios_contrib/etag/README.md)
  - Provides automatic `ETag` generation and conditional request handling (`If-None-Match` → `304`).

- **JSON-RPC**: `nexios_contrib.jrpc`
  - README: [nexios_contrib/jrpc/README.md](./nexios_contrib/jrpc/README.md)
  - JSON-RPC 2.0 server and client implementation for building RPC APIs.

More contribs will be added over time. Contributions welcome!

---

## Installation

Install the meta package (brings in all contribs):

```bash
pip install nexios_contrib
```

Or install directly from a specific package as they become available on PyPI.

---

## Quick Example (ETag)

```python
from nexios import NexiosApp
import nexios_contrib.etag as etag

app = NexiosApp()
app.add_middleware(etag.ETag())

@app.get("/")
async def home(request, response):
    return {"message": "Hello with ETag!"}
```

See the full guide in the [ETag README](./nexios_contrib/etag/README.md).

---

## Development

This repo uses **[uv](https://github.com/astral-sh/uv)** workspaces and **hatchling** for builds.

Common tasks:

```bash
# Sync workspace deps
uv sync

# Run tests
pytest -q

# Build wheel/sdist
python -m build
```

---

## Project Structure

```
./
├── nexios_contrib/
│   └── etag/                 # ETag middleware package
├── tests/
├── docs/
├── pyproject.toml
└── README.md
```

Each contrib package is versioned and released independently.

---

## Releasing

1. Update the package’s version in its `pyproject.toml` (SemVer).
2. Commit and push to `main`.
3. Create a release/tag.
4. Publish to PyPI.

---

Built with ❤️ by [@nexios-labs](https://github.com/nexios-labs)
