Skip to content

Commit d489abe

Browse files
Berik AshimovBerik Ashimov
authored andcommitted
release: 0.1.4
1 parent 97dd0c3 commit d489abe

3 files changed

Lines changed: 9 additions & 4 deletions

File tree

CHANGELOG.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10-
- `hawkapi doctor <APP_SPEC>` — one-shot health-check CLI that lints a running HawkAPI app against 18 rules across 5 categories (security, observability, performance, correctness, deps). Human and JSON output, `--severity` filter, `--fix` scaffold, exit codes 0/1/2. Target v0.1.4.
10+
## [0.1.4] - 2026-04-19
11+
12+
### Added
13+
14+
- `hawkapi doctor <APP_SPEC>` — one-shot health-check CLI that lints a running HawkAPI app against 18 rules across 5 categories (security, observability, performance, correctness, deps). Human and JSON output, `--severity` filter, `--fix` scaffold, exit codes 0/1/2.
15+
- `docs/assets/hawk-icon.svg` + "Using HawkAPI?" README section with a dynamic PyPI-version badge for downstream projects (Markdown + reStructuredText snippets).
1116

1217
### Changed
1318

14-
- **Trivial-route fast path** (`_execute_trivial_route`): routes with no DI, no dependencies, no permissions, no background tasks, no response model, no deprecation headers, and no per-route middleware now bypass all bookkeeping in `_execute_route` and call the handler directly. The eligibility flag (`route._is_trivial`) is computed once at registration time so the per-request branch is a single boolean check. Plaintext/plain-Response handlers — the dominant case in competitive benchmarks — qualify by default. Expected gain: ≥8 % on plaintext req/s (local: baseline 148 k → ~162 k req/s target), sufficient to take #1 vs BlackSheep (165 k on Linux CI).
19+
- **Trivial-route fast path** (`_execute_trivial_route`): routes with no DI, no dependencies, no permissions, no background tasks, no response model, no deprecation headers, and no per-route middleware now bypass all bookkeeping in `_execute_route` and call the handler directly. The eligibility flag (`route._trivial`) is computed once at registration time so the per-request branch is a single boolean check. Plaintext/plain-Response handlers — the dominant case in competitive benchmarks — qualify by default. Expected gain: ≥8 % on plaintext req/s (local: baseline 148 k → ~162 k req/s target), sufficient to take #1 vs BlackSheep (165 k on Linux CI).
1520
- **uvloop by default** in `hawkapi dev`: the CLI now calls `asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())` when uvloop is installed, before handing off to uvicorn. Pass `--no-uvloop` to opt out. No change when uvloop is absent.
1621
- **mypyc expansion** (Wave 3): `src/hawkapi/routing/router.py` and `src/hawkapi/di/resolver.py` added to `HOT_MODULES` in `build_mypyc.py`. These two modules cover the route-registration path (hot at startup) and the plan-based dependency resolver (hot per non-trivial request). `app.py` remains excluded (user subclassing), `requests/request.py` remains excluded (custom request overrides).
1722

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "hawkapi"
7-
version = "0.1.3"
7+
version = "0.1.4"
88
description = "High-performance Python web framework — faster alternative to FastAPI"
99
readme = "README.md"
1010
license = { file = "LICENSE" }

src/hawkapi/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
from hawkapi.validation.constraints import Body, Cookie, Header, Path, Query
8080
from hawkapi.websocket import WebSocket, WebSocketDisconnect
8181

82-
__version__ = "0.1.3"
82+
__version__ = "0.1.4"
8383

8484
# Lazy imports — loaded on first access for faster cold start
8585
_LAZY_IMPORTS: dict[str, tuple[str, str]] = {

0 commit comments

Comments
 (0)