Metadata-Version: 2.5
Name: web_fractal
Version: 0.2.1
Summary: Framework-agnostic constructor library: FilterBase DSL, ABAC, CRUD mixins, multi-protocol controllers, fractal extraction
Project-URL: Homepage, https://github.com/0nliner/web_fractal
Project-URL: Repository, https://github.com/0nliner/web_fractal
Author-email: Aleksandr Chudaikin <vkusnisaharok@gmail.com>
License: MIT
Keywords: abac,clean-architecture,crud,filters,pydantic,sqlalchemy
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Database
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: >=3.12
Requires-Dist: archtool>=2.0
Requires-Dist: click>=8.0
Requires-Dist: furl>=2.1
Requires-Dist: pydantic>=2.0
Requires-Dist: pytz>=2024.1
Requires-Dist: sqlalchemy>=2.0
Requires-Dist: typing-extensions>=4.12
Provides-Extra: aiohttp
Requires-Dist: aiohttp>=3.8; extra == 'aiohttp'
Provides-Extra: dev
Requires-Dist: aiohttp>=3.8; extra == 'dev'
Requires-Dist: aiosqlite; extra == 'dev'
Requires-Dist: fastapi>=0.100; extra == 'dev'
Requires-Dist: pytest-asyncio>=1.0; extra == 'dev'
Requires-Dist: pytest>=8.0; extra == 'dev'
Requires-Dist: ruff>=0.4; extra == 'dev'
Provides-Extra: django
Requires-Dist: django>=4.0; extra == 'django'
Provides-Extra: fastapi
Requires-Dist: fastapi>=0.100; extra == 'fastapi'
Provides-Extra: graphql
Requires-Dist: strawberry-graphql>=0.200; extra == 'graphql'
Provides-Extra: grpc
Requires-Dist: grpclib>=0.4; extra == 'grpc'
Provides-Extra: kafka
Requires-Dist: aiokafka>=0.9; extra == 'kafka'
Description-Content-Type: text/markdown

# web_fractal

Конструктор веб-приложений поверх SQLAlchemy и Pydantic: типобезопасный DSL
фильтров, CRUD-миксины, ABAC-правила доступа, контроллеры для нескольких
транспортов. Ядро не привязано к веб-фреймворку — интеграции подключаются
экстрами.

```bash
pip install web_fractal              # ядро: db, dtos, filters, mixins, security
pip install "web_fractal[fastapi]"   # + контроллеры и сборка FastAPI-приложения
```

## Что внутри

| Модуль | Зачем |
|---|---|
| `web_fractal.db` | `Base`, `UnitOfWork`, `paginate`, `apply_filters`, `copy_object` |
| `web_fractal.dtos` | Pydantic-база с `.not_blank`, `Pagination`, `MessageDTO` |
| `web_fractal.types` | `Unset`/`UNSET` — sentinel «не фильтровать», в отличие от `None` |
| `web_fractal.filters` | `FilterBase` + `FilterField[T]`: DSL фильтрации с автогенерацией query-параметров |
| `web_fractal.mixins` | `GenericRepo`, `GenericService` — CRUD без копипасты |
| `web_fractal.core.security` | ABAC: `SecurityContext`, `AccessRule`, `RowRule`, `FieldScope` |
| `web_fractal.http` | `HttpControllerABC`, `AutoHttpController` (требует экстру `fastapi`) |
| `web_fractal.building_utils` | Сборка FastAPI-приложения из archtool-инжектора (экстра `fastapi`) |
| `web_fractal.transports` | Контроллеры Kafka / gRPC / GraphQL (свои экстры) |

## Фильтры

```python
from web_fractal.filters import FilterBase, FilterField

class UserFilter(FilterBase):
    name: FilterField[str]
    age: FilterField[int]

# FastAPI-зависимость с явными query-параметрами в Swagger
UserFilterDep = UserFilter.as_fastapi_dep()
```

## Единица работы

```python
from web_fractal.db import UnitOfWork

async with UnitOfWork(session_maker) as uow:
    session = uow.get_session()
    ...
    await session.commit()
```

## Экстры

| Экстра | Что включает |
|---|---|
| `fastapi` | HTTP-контроллеры, middlewares, сборка приложения |
| `aiohttp` | `utils.download_large_file` |
| `kafka`, `grpc`, `graphql` | соответствующие транспорты |
| `django` | адаптеры для Django-проектов |

Пакет не импортирует подмодули на загрузке (PEP 562): `import web_fractal.db`
не требует ни FastAPI, ни aiohttp. Публичные имена доступны и из корня —
`from web_fractal import UnitOfWork` — но резолвятся лениво, при первом
обращении.

## Разработка

```bash
uv sync --extra dev
pytest
```

MIT.
