hawkapi 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. hawkapi-0.1.0/.github/workflows/ci.yml +86 -0
  2. hawkapi-0.1.0/.github/workflows/docs.yml +51 -0
  3. hawkapi-0.1.0/.github/workflows/publish.yml +30 -0
  4. hawkapi-0.1.0/.gitignore +35 -0
  5. hawkapi-0.1.0/CHANGELOG.md +51 -0
  6. hawkapi-0.1.0/LICENSE +21 -0
  7. hawkapi-0.1.0/PKG-INFO +975 -0
  8. hawkapi-0.1.0/README.md +922 -0
  9. hawkapi-0.1.0/benchmarks/bench_cold_start.py +50 -0
  10. hawkapi-0.1.0/benchmarks/bench_request_response.py +97 -0
  11. hawkapi-0.1.0/benchmarks/bench_routing.py +124 -0
  12. hawkapi-0.1.0/benchmarks/bench_serialization.py +122 -0
  13. hawkapi-0.1.0/benchmarks/bench_vs_fastapi.py +248 -0
  14. hawkapi-0.1.0/docs/CNAME +1 -0
  15. hawkapi-0.1.0/docs/api/index.md +37 -0
  16. hawkapi-0.1.0/docs/getting-started/installation.md +34 -0
  17. hawkapi-0.1.0/docs/getting-started/quickstart.md +86 -0
  18. hawkapi-0.1.0/docs/guide/configuration.md +79 -0
  19. hawkapi-0.1.0/docs/guide/dependency-injection.md +68 -0
  20. hawkapi-0.1.0/docs/guide/middleware.md +49 -0
  21. hawkapi-0.1.0/docs/guide/observability.md +52 -0
  22. hawkapi-0.1.0/docs/guide/permissions.md +69 -0
  23. hawkapi-0.1.0/docs/guide/responses.md +86 -0
  24. hawkapi-0.1.0/docs/guide/routing.md +84 -0
  25. hawkapi-0.1.0/docs/guide/security.md +55 -0
  26. hawkapi-0.1.0/docs/guide/static-files.md +38 -0
  27. hawkapi-0.1.0/docs/guide/testing.md +66 -0
  28. hawkapi-0.1.0/docs/guide/versioning.md +61 -0
  29. hawkapi-0.1.0/docs/guide/websockets.md +79 -0
  30. hawkapi-0.1.0/docs/index.md +50 -0
  31. hawkapi-0.1.0/examples/hello_world.py +203 -0
  32. hawkapi-0.1.0/hawkapi.png +0 -0
  33. hawkapi-0.1.0/mkdocs.yml +71 -0
  34. hawkapi-0.1.0/pyproject.toml +96 -0
  35. hawkapi-0.1.0/src/hawkapi/__init__.py +191 -0
  36. hawkapi-0.1.0/src/hawkapi/_compat/__init__.py +0 -0
  37. hawkapi-0.1.0/src/hawkapi/_compat/pydantic_adapter.py +41 -0
  38. hawkapi-0.1.0/src/hawkapi/_constants.py +39 -0
  39. hawkapi-0.1.0/src/hawkapi/_types.py +19 -0
  40. hawkapi-0.1.0/src/hawkapi/app.py +671 -0
  41. hawkapi-0.1.0/src/hawkapi/background.py +41 -0
  42. hawkapi-0.1.0/src/hawkapi/cli.py +64 -0
  43. hawkapi-0.1.0/src/hawkapi/config/__init__.py +3 -0
  44. hawkapi-0.1.0/src/hawkapi/config/env.py +36 -0
  45. hawkapi-0.1.0/src/hawkapi/config/profiles.py +41 -0
  46. hawkapi-0.1.0/src/hawkapi/config/settings.py +130 -0
  47. hawkapi-0.1.0/src/hawkapi/di/__init__.py +6 -0
  48. hawkapi-0.1.0/src/hawkapi/di/container.py +155 -0
  49. hawkapi-0.1.0/src/hawkapi/di/depends.py +42 -0
  50. hawkapi-0.1.0/src/hawkapi/di/provider.py +65 -0
  51. hawkapi-0.1.0/src/hawkapi/di/resolver.py +304 -0
  52. hawkapi-0.1.0/src/hawkapi/di/scope.py +79 -0
  53. hawkapi-0.1.0/src/hawkapi/exceptions.py +68 -0
  54. hawkapi-0.1.0/src/hawkapi/lifespan/__init__.py +4 -0
  55. hawkapi-0.1.0/src/hawkapi/lifespan/hooks.py +66 -0
  56. hawkapi-0.1.0/src/hawkapi/lifespan/manager.py +131 -0
  57. hawkapi-0.1.0/src/hawkapi/middleware/__init__.py +23 -0
  58. hawkapi-0.1.0/src/hawkapi/middleware/_pipeline.py +30 -0
  59. hawkapi-0.1.0/src/hawkapi/middleware/base.py +115 -0
  60. hawkapi-0.1.0/src/hawkapi/middleware/cors.py +169 -0
  61. hawkapi-0.1.0/src/hawkapi/middleware/error_handler.py +62 -0
  62. hawkapi-0.1.0/src/hawkapi/middleware/gzip.py +238 -0
  63. hawkapi-0.1.0/src/hawkapi/middleware/https_redirect.py +48 -0
  64. hawkapi-0.1.0/src/hawkapi/middleware/rate_limit.py +113 -0
  65. hawkapi-0.1.0/src/hawkapi/middleware/request_id.py +58 -0
  66. hawkapi-0.1.0/src/hawkapi/middleware/security_headers.py +68 -0
  67. hawkapi-0.1.0/src/hawkapi/middleware/timing.py +34 -0
  68. hawkapi-0.1.0/src/hawkapi/middleware/trusted_host.py +43 -0
  69. hawkapi-0.1.0/src/hawkapi/observability/__init__.py +6 -0
  70. hawkapi-0.1.0/src/hawkapi/observability/config.py +34 -0
  71. hawkapi-0.1.0/src/hawkapi/observability/logger.py +48 -0
  72. hawkapi-0.1.0/src/hawkapi/observability/metrics.py +34 -0
  73. hawkapi-0.1.0/src/hawkapi/observability/middleware.py +124 -0
  74. hawkapi-0.1.0/src/hawkapi/observability/tracing.py +40 -0
  75. hawkapi-0.1.0/src/hawkapi/openapi/__init__.py +10 -0
  76. hawkapi-0.1.0/src/hawkapi/openapi/breaking_changes.py +216 -0
  77. hawkapi-0.1.0/src/hawkapi/openapi/inspector.py +210 -0
  78. hawkapi-0.1.0/src/hawkapi/openapi/models.py +136 -0
  79. hawkapi-0.1.0/src/hawkapi/openapi/schema.py +324 -0
  80. hawkapi-0.1.0/src/hawkapi/openapi/ui.py +66 -0
  81. hawkapi-0.1.0/src/hawkapi/py.typed +0 -0
  82. hawkapi-0.1.0/src/hawkapi/requests/__init__.py +7 -0
  83. hawkapi-0.1.0/src/hawkapi/requests/form_data.py +162 -0
  84. hawkapi-0.1.0/src/hawkapi/requests/headers.py +51 -0
  85. hawkapi-0.1.0/src/hawkapi/requests/query_params.py +50 -0
  86. hawkapi-0.1.0/src/hawkapi/requests/request.py +207 -0
  87. hawkapi-0.1.0/src/hawkapi/requests/state.py +36 -0
  88. hawkapi-0.1.0/src/hawkapi/responses/__init__.py +20 -0
  89. hawkapi-0.1.0/src/hawkapi/responses/file_response.py +107 -0
  90. hawkapi-0.1.0/src/hawkapi/responses/html_response.py +24 -0
  91. hawkapi-0.1.0/src/hawkapi/responses/json_response.py +50 -0
  92. hawkapi-0.1.0/src/hawkapi/responses/plain_text.py +28 -0
  93. hawkapi-0.1.0/src/hawkapi/responses/redirect.py +24 -0
  94. hawkapi-0.1.0/src/hawkapi/responses/response.py +64 -0
  95. hawkapi-0.1.0/src/hawkapi/responses/sse.py +110 -0
  96. hawkapi-0.1.0/src/hawkapi/responses/streaming.py +77 -0
  97. hawkapi-0.1.0/src/hawkapi/routing/__init__.py +16 -0
  98. hawkapi-0.1.0/src/hawkapi/routing/_radix_tree.py +189 -0
  99. hawkapi-0.1.0/src/hawkapi/routing/controllers.py +247 -0
  100. hawkapi-0.1.0/src/hawkapi/routing/param_converters.py +21 -0
  101. hawkapi-0.1.0/src/hawkapi/routing/route.py +27 -0
  102. hawkapi-0.1.0/src/hawkapi/routing/router.py +372 -0
  103. hawkapi-0.1.0/src/hawkapi/routing/version_router.py +50 -0
  104. hawkapi-0.1.0/src/hawkapi/security/__init__.py +19 -0
  105. hawkapi-0.1.0/src/hawkapi/security/api_key.py +104 -0
  106. hawkapi-0.1.0/src/hawkapi/security/base.py +29 -0
  107. hawkapi-0.1.0/src/hawkapi/security/http_basic.py +69 -0
  108. hawkapi-0.1.0/src/hawkapi/security/http_bearer.py +55 -0
  109. hawkapi-0.1.0/src/hawkapi/security/oauth2.py +56 -0
  110. hawkapi-0.1.0/src/hawkapi/security/permissions.py +69 -0
  111. hawkapi-0.1.0/src/hawkapi/serialization/__init__.py +4 -0
  112. hawkapi-0.1.0/src/hawkapi/serialization/encoder.py +39 -0
  113. hawkapi-0.1.0/src/hawkapi/serialization/negotiation.py +62 -0
  114. hawkapi-0.1.0/src/hawkapi/staticfiles.py +186 -0
  115. hawkapi-0.1.0/src/hawkapi/testing/__init__.py +4 -0
  116. hawkapi-0.1.0/src/hawkapi/testing/client.py +277 -0
  117. hawkapi-0.1.0/src/hawkapi/testing/overrides.py +40 -0
  118. hawkapi-0.1.0/src/hawkapi/testing/plugin.py +23 -0
  119. hawkapi-0.1.0/src/hawkapi/validation/__init__.py +17 -0
  120. hawkapi-0.1.0/src/hawkapi/validation/constraints.py +54 -0
  121. hawkapi-0.1.0/src/hawkapi/validation/decoder.py +47 -0
  122. hawkapi-0.1.0/src/hawkapi/validation/errors.py +77 -0
  123. hawkapi-0.1.0/src/hawkapi/websocket/__init__.py +3 -0
  124. hawkapi-0.1.0/src/hawkapi/websocket/connection.py +149 -0
  125. hawkapi-0.1.0/tests/__init__.py +0 -0
  126. hawkapi-0.1.0/tests/conftest.py +11 -0
  127. hawkapi-0.1.0/tests/integration/__init__.py +0 -0
  128. hawkapi-0.1.0/tests/integration/test_app.py +345 -0
  129. hawkapi-0.1.0/tests/integration/test_di_integration.py +181 -0
  130. hawkapi-0.1.0/tests/integration/test_production_features.py +160 -0
  131. hawkapi-0.1.0/tests/integration/test_subapp_docs.py +68 -0
  132. hawkapi-0.1.0/tests/integration/test_test_client.py +162 -0
  133. hawkapi-0.1.0/tests/unit/__init__.py +0 -0
  134. hawkapi-0.1.0/tests/unit/test_app_coverage.py +155 -0
  135. hawkapi-0.1.0/tests/unit/test_audit_coverage.py +702 -0
  136. hawkapi-0.1.0/tests/unit/test_background.py +88 -0
  137. hawkapi-0.1.0/tests/unit/test_body_limits.py +78 -0
  138. hawkapi-0.1.0/tests/unit/test_breaking_changes.py +153 -0
  139. hawkapi-0.1.0/tests/unit/test_cli.py +70 -0
  140. hawkapi-0.1.0/tests/unit/test_coercion.py +54 -0
  141. hawkapi-0.1.0/tests/unit/test_cold_start.py +73 -0
  142. hawkapi-0.1.0/tests/unit/test_config.py +139 -0
  143. hawkapi-0.1.0/tests/unit/test_constants.py +27 -0
  144. hawkapi-0.1.0/tests/unit/test_constraints.py +46 -0
  145. hawkapi-0.1.0/tests/unit/test_controllers.py +133 -0
  146. hawkapi-0.1.0/tests/unit/test_di.py +196 -0
  147. hawkapi-0.1.0/tests/unit/test_encoder.py +59 -0
  148. hawkapi-0.1.0/tests/unit/test_encoder_coverage.py +52 -0
  149. hawkapi-0.1.0/tests/unit/test_error_handler.py +100 -0
  150. hawkapi-0.1.0/tests/unit/test_exceptions.py +45 -0
  151. hawkapi-0.1.0/tests/unit/test_form_data.py +161 -0
  152. hawkapi-0.1.0/tests/unit/test_generator_deps.py +140 -0
  153. hawkapi-0.1.0/tests/unit/test_gzip_middleware.py +153 -0
  154. hawkapi-0.1.0/tests/unit/test_http_basic.py +107 -0
  155. hawkapi-0.1.0/tests/unit/test_inspector_coverage.py +112 -0
  156. hawkapi-0.1.0/tests/unit/test_lifespan.py +196 -0
  157. hawkapi-0.1.0/tests/unit/test_middleware.py +290 -0
  158. hawkapi-0.1.0/tests/unit/test_middleware_coverage.py +187 -0
  159. hawkapi-0.1.0/tests/unit/test_misc_coverage.py +290 -0
  160. hawkapi-0.1.0/tests/unit/test_negotiation.py +69 -0
  161. hawkapi-0.1.0/tests/unit/test_observability.py +217 -0
  162. hawkapi-0.1.0/tests/unit/test_openapi.py +289 -0
  163. hawkapi-0.1.0/tests/unit/test_openapi_inspector.py +218 -0
  164. hawkapi-0.1.0/tests/unit/test_openapi_models.py +156 -0
  165. hawkapi-0.1.0/tests/unit/test_openapi_schema_extra.py +198 -0
  166. hawkapi-0.1.0/tests/unit/test_openapi_security.py +100 -0
  167. hawkapi-0.1.0/tests/unit/test_overrides.py +38 -0
  168. hawkapi-0.1.0/tests/unit/test_permissions.py +216 -0
  169. hawkapi-0.1.0/tests/unit/test_production_features.py +388 -0
  170. hawkapi-0.1.0/tests/unit/test_pydantic_adapter.py +65 -0
  171. hawkapi-0.1.0/tests/unit/test_rate_limit.py +128 -0
  172. hawkapi-0.1.0/tests/unit/test_request.py +199 -0
  173. hawkapi-0.1.0/tests/unit/test_request_extra.py +187 -0
  174. hawkapi-0.1.0/tests/unit/test_resolver_branches.py +244 -0
  175. hawkapi-0.1.0/tests/unit/test_resolver_coverage.py +201 -0
  176. hawkapi-0.1.0/tests/unit/test_response.py +154 -0
  177. hawkapi-0.1.0/tests/unit/test_response_model.py +125 -0
  178. hawkapi-0.1.0/tests/unit/test_responses_advanced.py +167 -0
  179. hawkapi-0.1.0/tests/unit/test_routing.py +182 -0
  180. hawkapi-0.1.0/tests/unit/test_scope_cleanup.py +85 -0
  181. hawkapi-0.1.0/tests/unit/test_security.py +160 -0
  182. hawkapi-0.1.0/tests/unit/test_security_middleware.py +154 -0
  183. hawkapi-0.1.0/tests/unit/test_serialization.py +67 -0
  184. hawkapi-0.1.0/tests/unit/test_staticfiles.py +107 -0
  185. hawkapi-0.1.0/tests/unit/test_sub_dependencies.py +160 -0
  186. hawkapi-0.1.0/tests/unit/test_sync_handlers.py +80 -0
  187. hawkapi-0.1.0/tests/unit/test_upload_file_async.py +57 -0
  188. hawkapi-0.1.0/tests/unit/test_validation_errors_extra.py +46 -0
  189. hawkapi-0.1.0/tests/unit/test_versioning.py +188 -0
  190. hawkapi-0.1.0/tests/unit/test_websocket.py +232 -0
  191. hawkapi-0.1.0/uv.lock +1337 -0
@@ -0,0 +1,86 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ test:
14
+ name: Test (Python ${{ matrix.python-version }})
15
+ runs-on: ubuntu-latest
16
+ strategy:
17
+ fail-fast: false
18
+ matrix:
19
+ python-version: ["3.12", "3.13"]
20
+
21
+ steps:
22
+ - uses: actions/checkout@v4
23
+
24
+ - name: Install uv
25
+ uses: astral-sh/setup-uv@v4
26
+ with:
27
+ enable-cache: true
28
+
29
+ - name: Set up Python ${{ matrix.python-version }}
30
+ run: uv python install ${{ matrix.python-version }}
31
+
32
+ - name: Install dependencies
33
+ run: uv sync --extra dev --extra pydantic
34
+
35
+ - name: Run tests with coverage
36
+ run: uv run pytest tests/ --cov=hawkapi --cov-report=xml -q
37
+
38
+ - name: Upload coverage
39
+ if: matrix.python-version == '3.13'
40
+ uses: codecov/codecov-action@v4
41
+ with:
42
+ file: coverage.xml
43
+ fail_ci_if_error: false
44
+
45
+ lint:
46
+ name: Lint
47
+ runs-on: ubuntu-latest
48
+ steps:
49
+ - uses: actions/checkout@v4
50
+
51
+ - name: Install uv
52
+ uses: astral-sh/setup-uv@v4
53
+ with:
54
+ enable-cache: true
55
+
56
+ - name: Set up Python
57
+ run: uv python install 3.13
58
+
59
+ - name: Install dependencies
60
+ run: uv sync --extra dev --extra pydantic
61
+
62
+ - name: Ruff check
63
+ run: uv run ruff check src/ tests/
64
+
65
+ - name: Ruff format check
66
+ run: uv run ruff format --check src/ tests/
67
+
68
+ typecheck:
69
+ name: Type check
70
+ runs-on: ubuntu-latest
71
+ steps:
72
+ - uses: actions/checkout@v4
73
+
74
+ - name: Install uv
75
+ uses: astral-sh/setup-uv@v4
76
+ with:
77
+ enable-cache: true
78
+
79
+ - name: Set up Python
80
+ run: uv python install 3.13
81
+
82
+ - name: Install dependencies
83
+ run: uv sync --extra dev --extra pydantic --extra uvicorn
84
+
85
+ - name: Pyright
86
+ run: uv run pyright src/
@@ -0,0 +1,51 @@
1
+ name: Deploy Docs
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+ pages: write
11
+ id-token: write
12
+
13
+ concurrency:
14
+ group: pages
15
+ cancel-in-progress: false
16
+
17
+ jobs:
18
+ build:
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+
23
+ - name: Install uv
24
+ uses: astral-sh/setup-uv@v4
25
+ with:
26
+ enable-cache: true
27
+
28
+ - name: Set up Python
29
+ run: uv python install 3.13
30
+
31
+ - name: Install dependencies
32
+ run: uv sync --extra docs
33
+
34
+ - name: Build docs
35
+ run: uv run mkdocs build --strict
36
+
37
+ - name: Upload artifact
38
+ uses: actions/upload-pages-artifact@v3
39
+ with:
40
+ path: site/
41
+
42
+ deploy:
43
+ environment:
44
+ name: github-pages
45
+ url: ${{ steps.deployment.outputs.page_url }}
46
+ runs-on: ubuntu-latest
47
+ needs: build
48
+ steps:
49
+ - name: Deploy to GitHub Pages
50
+ id: deployment
51
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,30 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ permissions:
8
+ contents: read
9
+ id-token: write
10
+
11
+ jobs:
12
+ publish:
13
+ runs-on: ubuntu-latest
14
+ environment: pypi
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+
18
+ - name: Install uv
19
+ uses: astral-sh/setup-uv@v4
20
+ with:
21
+ enable-cache: true
22
+
23
+ - name: Set up Python
24
+ run: uv python install 3.13
25
+
26
+ - name: Build
27
+ run: uv build
28
+
29
+ - name: Publish to PyPI
30
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,35 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *$py.class
4
+ *.so
5
+ dist/
6
+ build/
7
+ *.egg-info/
8
+ *.egg
9
+ .eggs/
10
+ .venv/
11
+ venv/
12
+ env/
13
+ .env
14
+ *.log
15
+ .mypy_cache/
16
+ .pyright/
17
+ .ruff_cache/
18
+ .pytest_cache/
19
+ htmlcov/
20
+ .coverage
21
+ .coverage.*
22
+ coverage.xml
23
+ *.cover
24
+ .hypothesis/
25
+ .tox/
26
+ .nox/
27
+ *.swp
28
+ *.swo
29
+ *~
30
+ .DS_Store
31
+ .idea/
32
+ .vscode/
33
+ .history/
34
+ .claude/
35
+ site/
@@ -0,0 +1,51 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.1.0] - 2026-03-03
9
+
10
+ ### Added
11
+
12
+ - ASGI 3.0 application core with custom middleware pipeline
13
+ - Radix tree router with path parameters (`int`, `str`, `float`, `uuid`)
14
+ - Request/response layer: JSON, HTML, PlainText, Redirect, Streaming, File, SSE
15
+ - Dependency injection container with singleton, scoped, and transient lifecycles
16
+ - Generator dependencies with `yield` (async and sync) for resource cleanup
17
+ - Sub-dependencies: nested `Depends()` resolution with automatic cleanup ordering
18
+ - `response_model` parameter for response filtering and validation
19
+ - OpenAPI 3.1 schema auto-generation from type annotations
20
+ - Swagger UI, ReDoc, and Scalar documentation endpoints
21
+ - Middleware: CORS, GZip, Timing, Trusted Host, Security Headers, Request ID, HTTPS Redirect, Rate Limiting, Error Handler
22
+ - Security schemes: API Key (header/query/cookie), HTTP Bearer, HTTP Basic, OAuth2 Password Bearer
23
+ - WebSocket support with async iteration and dependency injection
24
+ - Class-based controllers with HTTP method decorators
25
+ - Router with prefix and tag support, sub-app mounting
26
+ - `Settings` base class with environment variable binding and profile support
27
+ - `TestClient` for synchronous testing with `pytest` integration
28
+ - Scoped DI overrides for test isolation
29
+ - `BackgroundTasks` for post-response execution
30
+ - `StaticFiles` with directory serving, HTML mode, path traversal protection, ETag, Last-Modified, Cache-Control, 304 Not Modified
31
+ - `HTTPException` with RFC 9457 Problem Details responses
32
+ - Custom exception handlers
33
+ - Request body size limits (default 10 MB)
34
+ - CLI tool (`hawkapi dev`) with auto-reload via uvicorn
35
+ - Sync handler support (auto threadpool execution)
36
+ - API Versioning: `VersionRouter` for URL-based versioning with per-version OpenAPI specs
37
+ - Breaking Changes Detector: `detect_breaking_changes()` compares OpenAPI specs
38
+ - Declarative RBAC: `PermissionPolicy` with `permissions` on routes and WebSocket endpoints
39
+ - Observability: `ObservabilityMiddleware` with structured logging, tracing (OpenTelemetry), and in-memory metrics
40
+ - Cold Start Optimization: lazy imports in `__init__.py`, `serverless=True` mode
41
+ - `Request.url` property for full URL reconstruction
42
+ - OpenAPI `x-permissions` extension for routes with permissions
43
+ - Health check endpoint (`health_url="/healthz"`, configurable or disableable)
44
+ - Request timeout (`request_timeout` parameter with `asyncio.wait_for`, returns 504)
45
+ - Graceful shutdown: in-flight request tracking with configurable drain timeout
46
+ - `content_security_policy` parameter for `SecurityHeadersMiddleware`
47
+ - `py.typed` marker for PEP 561 typed packages
48
+ - Pyright strict mode compliance (0 errors)
49
+ - MkDocs documentation site
50
+
51
+ [0.1.0]: https://github.com/ashimov/HawkAPI/releases/tag/v0.1.0
hawkapi-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Berik Ashimov
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.